Tôi đang viết một bản sao của Wolfenstein 3D chỉ sử dụng lõi OpenGL 3.3 cho trường đại học và tôi đã gặp phải một chút vấn đề với sprites. về khoảng cách. Từ những gì tôi có thể nói, các phiên bản trước của OGL thực tế sẽ làm điều này cho bạn, nhưng chức năng đó đã bị xóa và tất cả những nỗ lực của tôi để thực hiện lại nó đã dẫn đến thất bại hoàn toàn.Thay đổi kích thước điểm ảnh sprites dựa trên khoảng cách từ máy ảnh
Triển khai hiện tại của tôi có thể thực hiện được ở khoảng cách, không quá tồi tàn ở tầm trung và bizzare ở cự ly gần.
Vấn đề chính (tôi nghĩ) là tôi không hiểu về toán học tôi đang sử dụng.
Kích thước mục tiêu của sprite là lớn hơn một chút so với khung nhìn, vì vậy nó nên 'đi ra khỏi hình ảnh' khi bạn nhận được quyền lên đến nó, nhưng nó không. Nó trở nên nhỏ hơn và điều đó khiến tôi khó hiểu.
Tôi đã ghi lại một video nhỏ về điều này, trong trường hợp các từ không đủ. (Mine là ở bên phải)
bất cứ ai có thể trực tiếp tôi để nơi tôi sẽ sai, và giải thích lý do tại sao?
Code:
C++
// setup
glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT);
glEnable(GL_PROGRAM_POINT_SIZE);
// Drawing
glUseProgram(StaticsProg);
glBindVertexArray(statixVAO);
glUniformMatrix4fv(uStatixMVP, 1, GL_FALSE, glm::value_ptr(MVP));
glDrawArrays(GL_POINTS, 0, iNumSprites);
Vertex Shader
#version 330 core
layout(location = 0) in vec2 pos;
layout(location = 1) in int spriteNum_;
flat out int spriteNum;
uniform mat4 MVP;
const float constAtten = 0.9;
const float linearAtten = 0.6;
const float quadAtten = 0.001;
void main() {
spriteNum = spriteNum_;
gl_Position = MVP * vec4(pos.x + 1, pos.y, 0.5, 1); // Note: I have fiddled the MVP so that z is height rather than depth, since this is how I learned my vectors.
float dist = distance(gl_Position, vec4(0,0,0,1));
float attn = constAtten/((1 + linearAtten * dist) * (1 + quadAtten * dist * dist));
gl_PointSize = 768.0 * attn;
}
Fragment Shader
#version 330 core
flat in int spriteNum;
out vec4 color;
uniform sampler2DArray Sprites;
void main() {
color = texture(Sprites, vec3(gl_PointCoord.s, gl_PointCoord.t, spriteNum));
if (color.a < 0.2)
discard;
}
Tại sao bạn sử dụng 'pos.x + 1'? –
Tôi nghĩ rằng đó là bởi vì anh ta đặt vị trí trung tâm ma sát xuống bên trái, nhưng anh ta thực sự muốn điểm neo ở trung tâm trên cùng. –
Tôi muốn điểm gắn kết nằm ở trung tâm của cạnh dưới, nhưng vì một loạt các vấn đề liên kết mà tôi không có xung quanh để phân loại, tôi phải thay đổi rất nhiều thứ xung quanh một cách kỳ lạ. –