首页 > 解决方案 > 向着色器添加线条不会绘制任何内容

问题描述

我有这个顶点着色器。当我删除in vec3 LVertexNorm以及与之相关的所有内容时。它渲染得很好。但是,如果我添加它,则不再呈现任何内容。

 #version 140

in vec3 LVertexNorm;
in vec3 LVertexPos2D;

uniform mat4 MVP;

out vec3 norm;

void main() {
    norm = LVertexNorm;
    gl_Position = MVP * vec4( LVertexPos2D.x, LVertexPos2D.y, LVertexPos2D.z, 1 );
}

片段着色器

    #version 140

in vec3 norm;
out vec4 LFragment; 
void main() { 
    LFragment = vec4( 1.0,1.0,1.0, 1.0 ); 
}

以及用于构建 VAO 的代码

    glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, verticesCount * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(program->getAttribute("LVertexPos2D"), 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, nbo);
glBufferData(GL_ARRAY_BUFFER, normalCount * sizeof(GLfloat), normals, GL_STATIC_DRAW);
glVertexAttribPointer(program->getAttribute("LVertexNorm"), 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesCount * sizeof(GLuint), indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBindVertexArray(0);

我尝试了不同的方法。并且总是相同的结果。添加 LVertexNorm 后,着色器停止工作。我不知道为什么。可能有什么问题?

标签: c++openglglslshadervao

解决方案


的参数glEnableVertexAttribArray必须是顶点属性索引:

GLuint pos_inx = program->getAttribute("LVertexPos2D")
glVertexAttribPointer(pos_inx, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(pos_inx);
GLuint norm_inx = program->getAttribute("LVertexNorm");
glVertexAttribPointer(norm_inx, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(norm_inx);

当您有顶点着色器输入变量in vec3 LVertexNorm;in vec3 LVertexPos2D;时,可能LVertexNorm会获取属性索引 0 并LVertexPos2D获取属性索引 1。由于未启用顶点属性 1,因此未指定顶点位置。
实际上,属性索引没有指定,可以是任意数字。然而,大多数驱动程序使用从 0 开始的升序索引。


推荐阅读