c++ - 向着色器添加线条不会绘制任何内容
问题描述
我有这个顶点着色器。当我删除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 后,着色器停止工作。我不知道为什么。可能有什么问题?
解决方案
的参数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 开始的升序索引。
推荐阅读
- javascript - 使用 javascript 添加书签/收藏夹(无 JQuery)
- javascript - 如何在浏览器网络选项卡中启用“禁用缓存”?
- matrix - 当表达式返回整数时,为什么过滤器会尝试比较字符串和 int32 数据类型?
- git - 通过子模块更新 --init --recursive --remote 克隆子模块时出现错误 403
- python - Discord.py Bot 重命名 VoiceChannel 有时只能工作
- r - 在R中的新df中为新值创建一个循环
- vue.js - VueJS 监听组件内部的外部事件
- c - 从 C 中调用带有函数参数的 Rust 函数会导致 SegFault
- azure-devops - 需要从 azure devops 中的 Jacoco 代码覆盖范围中排除文件夹或 POM 相对路径
- c++ - 这个方程如何 x + y = x & y + x | y 成立(假设 x, y > 0)?