【发布时间】:2012-01-26 09:18:32
【问题描述】:
我正在为大学编写仅使用核心 OpenGL 3.3 的 Wolfenstein 3D 克隆,我遇到了精灵的一些问题,即让它们根据距离正确缩放。
据我所知,以前版本的 OGL 实际上会为您执行此操作,但该功能已被删除,并且我所有重新实现它的尝试都导致完全失败。
我目前的实现在远距离上是可以通过的,在中距离并不太破旧,而在近距离则很奇怪。
主要问题(我认为)是我不了解我正在使用的数学。
精灵的目标尺寸比视口稍大,所以当你接近它时它应该“走出图片”,但事实并非如此。它变小了,这让我很困惑。
我录制了一个小视频,以防文字不够。 (我的在右边)
谁能指导我到哪里出错,并解释原因?
代码:
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);
顶点着色器
#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;
}
片段着色器
#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;
}
【问题讨论】:
-
我认为是因为他将精灵中心位置设置为左下方,但他确实希望锚点在顶部中心。
-
我希望连接点位于底部边缘的中心,但是由于一堆对齐问题我没有时间整理,我不得不移动很多周围的事情有些奇怪。
标签: c++ opengl glsl opengl-3 point-sprites