GLSL 4.5:为什么我的 "in" 颜色变量未被 glGetAttribLocation 找到
GLSL 4.5: Why is my "in" variable for Color Not Being Found by glGetAttribLocation
这是顶点着色器
#version 450
in vec3 iPosition;
in vec4 iColor;
out vec4 oColor;
uniform mat4 uMVP;
void main()
{
oColor = iColor;
gl_Position = uMVP * vec4(iPosition, 1.0);
}
这是片段着色器
#version 450
in vec4 iColor;
out vec4 oColor;
void main()
{
oColor = iColor;
}
没有粘贴我所有的代码,下面是我所做的:
1)每次调用Open GL函数调用后,我都有
glGetError
。我没有得到任何错误,直到我调用glGetAttribLocation
在顶点着色器的iccolor变量。我在分别调用
glCompileShader
和glLinkProgram
后右边有如下代码:
GLint isCompiled = 0;
glGetShaderiv(m_fragmentShader, GL_COMPILE_STATUS, &isCompiled); GL_CALL
if(isCompiled == GL_FALSE) {
GLint maxLength = 0;
glGetShaderiv(m_fragmentShader, GL_INFO_LOG_LENGTH, &maxLength); GL_CALL
std::vector<GLchar> errorLog(maxLength);
glGetShaderInfoLog(m_fragmentShader, maxLength, &maxLength, &errorLog[0]);
GL_CALL
std::stringstream out;
std::copy(errorLog.begin(), errorLog.end(), std::ostream_iterator<char>(
out, ""));
qDebug() << out.str().c_str();
glDeleteShader(m_fragmentShader); GL_CALL
QCoreApplication::exit(-1);
}
GLint isLinked = 0;
glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, (int *)&isLinked);
if(isLinked == GL_FALSE) {
GLint maxLength = 0;
glGetProgramiv(m_shaderProgram, GL_INFO_LOG_LENGTH, &maxLength); GL_CALL
std::vector<GLchar> infoLog(maxLength);
glGetProgramInfoLog(m_shaderProgram, maxLength, &maxLength, &infoLog[0]);
GL_CALL
std::stringstream out;
std::copy(infoLog.begin(), infoLog.end(), std::ostream_iterator<char>(
out, ""));
qDebug() << out.str().c_str();
glDeleteProgram(m_shaderProgram); GL_CALL
glDeleteShader(m_vertexShader); GL_CALL
glDeleteShader(m_fragmentShader); GL_CALL
QCoreApplication::exit(-1);
}
我试图将版本更改回150,但这给出了相同的错误。我知道有些实现会优化变量。但我显然是用这个来决定颜色的。
我打算回到版本控制历史,看看是什么变化带来了这个错误,但这可能需要我一点。
如果有帮助的话,下面是draw函数的简化版本:
void Spline::draw()
{
glUseProgram(m_shaderProgram); GL_CALL
GLint posAttrib = glGetAttribLocation(m_shaderProgram, "iPosition"); GL_CALL
GLint colAttrib = glGetAttribLocation(m_shaderProgram, "iColor"); GL_CALL
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); GL_CALL
std::size_t stride = verts::traits::stride;
std::size_t dimension1 = verts::datum_type::internal_type1::dimension;
std::size_t byte_offset1 = verts::traits::type1_byte_offset;
glEnableVertexAttribArray(posAttrib); GL_CALL
glVertexAttribPointer(posAttrib, dimension1, GL_FLOAT, GL_FALSE,
stride, (void*)byte_offset1); GL_CALL
std::size_t dimension2 = verts::datum_type::internal_type2::dimension;
std::size_t byte_offset2 = verts::traits::type2_byte_offset;
glEnableVertexAttribArray(colAttrib); GL_CALL
glVertexAttribPointer(colAttrib, dimension2, GL_FLOAT, GL_FALSE,
stride, (void*)byte_offset2); GL_CALL
opengl_math::matrix_4X4<float, opengl_math::column> model(
opengl_math::identity);
opengl_math::matrix_4X4<float, opengl_math::column> view =
opengl_math::look_at<float, opengl_math::column>(
opengl_math::point_3d<float>(0.0f, 0.0f, 20.0f),
opengl_math::point_3d<float>(0.0f, 0.0f, 0.0f),
opengl_math::vector_3d<float>(0.0f, 1.0f, 0.0f));
GLint uniMVP = glGetUniformLocation(m_shaderProgram, "uMVP"); GL_CALL
glUniformMatrix4fv(uniMVP, 1, GL_FALSE,
(m_projection * view * model).to_gl_matrix()); GL_CALL
glDrawArrays(GL_LINE_STRIP, 0, m_vertexAttrib.get_attribute_count());
GL_CALL
}
您使用iColor
作为两个着色器阶段的输入名称。由于片段着色器属性不能被查询,你必须确保名称在着色器中是唯一的。可以使用以下代码:
顶点:
#version 450
in vec3 iPosition;
in vec4 iColor;
out vec4 xColor;
uniform mat4 uMVP;
void main()
{
xColor = iColor;
gl_Position = uMVP * vec4(iPosition, 1.0);
}
片段:
#version 450
in vec4 xColor;
out vec4 oColor;
void main()
{
oColor = xColor;
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 执行函数时导致崩溃的变量
- 变量没有改变?通过向量的函数调用