Opengl 4.3 gl_VertexID不随GLDrawArray递增
我很难理解为什么gl_VertexID在下面呈现“调试文本”的代码中没有为每个新顶点正确递增。提示/提示 (原始代码在本文底部引用) 以下是顶点着色器:Opengl 4.3 gl_VertexID不随GLDrawArray递增,opengl,glsl,Opengl,Glsl,我很难理解为什么gl_VertexID在下面呈现“调试文本”的代码中没有为每个新顶点正确递增。提示/提示 (原始代码在本文底部引用) 以下是顶点着色器: #version 430 core layout( location = 0 ) in int Character; out int vCharacter; out int vPosition; void main() { vPosition = gl_VertexID; vCharacter = Character;
#version 430 core
layout( location = 0 ) in int Character;
out int vCharacter;
out int vPosition;
void main()
{
vPosition = gl_VertexID;
vCharacter = Character;
gl_Position = vec4(0, 0, 0, 1);
}
几何体着色器:
#version 430 core
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
in int vCharacter[1];
in int vPosition[1];
out vec2 gTexCoord;
uniform sampler2D Sampler;
uniform vec2 CellSize;
uniform vec2 CellOffset;
uniform vec2 RenderSize;
uniform vec2 RenderOrigin;
void main()
{
// Determine the final quad's position and size:
float x = RenderOrigin.x + float(vPosition[0]) * RenderSize.x * 2.0f;
float y = RenderOrigin.y;
vec4 P = vec4(x, y, 0, 1);
vec4 U = vec4(1, 0, 0, 0) * RenderSize.x;
vec4 V = vec4(0, 1, 0, 0) * RenderSize.y;
// Determine the texture coordinates:
int letter = vCharacter[0];
letter = clamp(letter - 32, 0, 96);
int row = letter / 16 + 1;
int col = letter % 16;
float S0 = CellOffset.x + CellSize.x * col;
float T0 = CellOffset.y + 1 - CellSize.y * row;
float S1 = S0 + CellSize.x - CellOffset.x;
float T1 = T0 + CellSize.y;
// Output the quad's vertices:
gTexCoord = vec2(S0, T1); gl_Position = P - U - V; EmitVertex();
gTexCoord = vec2(S1, T1); gl_Position = P + U - V; EmitVertex();
gTexCoord = vec2(S0, T0); gl_Position = P - U + V; EmitVertex();
gTexCoord = vec2(S1, T0); gl_Position = P + U + V; EmitVertex();
EndPrimitive();
}
抽签通知和其他相关代码:
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
GLuint attribLocation = glGetAttribLocation(m_ProgramTextPrinter, "Character");
glVertexAttribIPointer(attribLocation, 1, GL_UNSIGNED_BYTE, 1, text.data()->c_str());
glEnableVertexAttribArray(attribLocation);
glDrawArrays(GL_POINTS, 0, text.data()->size());
基本上,这段代码将用于一些文本呈现。当我使用这个代码时,我看到我的字母被放在彼此的上面。当我修改
glVertexAttribIPointer(attribLocation, 1, GL_UNSIGNED_BYTE, 1, text.data()->c_str());
进入
我注意到几何体着色器中的x方向发生了预期的移动,尽管如此,字母仍然彼此重叠
我使用的是NVIDIA Geforce GT 630M,驱动程序版本:320.18和OpenGL 4.3上下文
正如巴特克所暗示的那样,我使用VBO使代码正常工作:我基本上替换了
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
GLuint attribLocation = glGetAttribLocation(m_ProgramTextPrinter, "Character");
glVertexAttribIPointer(attribLocation, 1, GL_UNSIGNED_BYTE, 1, text.data()->c_str());
glEnableVertexAttribArray(attribLocation);
glDrawArrays(GL_POINTS, 0, text.data()->size());
与
正如巴特克暗示的那样,我使用VBOs使代码正常工作:我基本上替换了
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
GLuint attribLocation = glGetAttribLocation(m_ProgramTextPrinter, "Character");
glVertexAttribIPointer(attribLocation, 1, GL_UNSIGNED_BYTE, 1, text.data()->c_str());
glEnableVertexAttribArray(attribLocation);
glDrawArrays(GL_POINTS, 0, text.data()->size());
与
IIRC非VBO
glVertexAttrib(I)指针
偏移现在已被弃用(规范4.3,§10.3.1)。不过它看起来非常时髦:)也请更改strlen(text.data()->c_str())->text.data()->size()
谢谢您指出更好的size()调用。我编辑了代码。另外,根据实际问题:我希望几何体着色器可以移动每个字母的点,顶点着色器可以移动每个字母。(我会将制服RenderOrigin
移动到VS)。我不确定它是否会修复它,但这将为您节省3/4的添加(假设四元):)IIRC非VBOglVertexAttrib(I)指针
偏移量现在已被弃用(规范4.3,§10.3.1)。不过它看起来非常时髦:)也请更改strlen(text.data()->c_str())->text.data()->size()
谢谢您指出更好的size()调用。我编辑了代码。另外,根据实际问题:我希望几何体着色器可以移动每个字母的点,顶点着色器可以移动每个字母。(我会将制服RenderOrigin
移动到VS)。我不确定它是否会修复它,但这会为您节省3/4的添加量(假设四元):
GLuint vaoID, bufferID;
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
glGenBuffers(1, &bufferID);
glBindBuffer(GL_ARRAY_BUFFER, bufferID);
glBufferData(GL_ARRAY_BUFFER, text.data()->size() * sizeof(GL_UNSIGNED_BYTE), text.data()->data(), GL_DYNAMIC_DRAW);
GLuint attribLocation = glGetAttribLocation(m_ProgramTextPrinter, "Character");
glVertexAttribIPointer(attribLocation, 1, GL_UNSIGNED_BYTE, 0, 0);
glEnableVertexAttribArray(attribLocation);
glDrawArrays(GL_POINTS, 0, text.data()->size());
glDeleteVertexArrays(1, &vaoID);
glDeleteBuffers(1, &bufferID);