我一直在为基本的渲染应用程序编写一些代码。
渲染器代码包括为渲染实体设置顶点阵列和顶点缓冲区对象,并创建3个纹理单元,分别用作漫反射,镜面反射和发射组件。我为我的着色器编写了一个包装类,用于创建和设置制服。
void Shader::SetVec3Uniform(const GLchar * name, vec3 data)
{
glUniform3f(glGetUniformLocation(this->program, name), data);
}
当我使用上述功能设置制服时,它不会呈现预期的结果。但是当我在设置制服之前找到位置时,它会正确渲染。我使用下面的函数来设置它。
void Shader::SetVec3Uniform(GLint loc, vec3 data)
{
glUniform3f(loc, data.x, data.y, data.z);
}
所以我的问题是,数据是否丢失,数据是否未及时到达GPU上的着色器?老实说,我很难过。不知道为什么制服设置方式的这种细微差别导致它的渲染产生这样的差异。
有人可以对此有所了解吗?
答案 0 :(得分:0)
嗯,根据docs,函数glUniform3f
的原型是:
void glUniform3f(GLint location,
GLfloat v0,
GLfloat v1,
GLfloat v2);
,对于函数glUniform3fv
,它是:
void glUniform3fv(GLint location,
GLsizei count,
const GLfloat *value);
vec3
如何定义?如果您有类似的东西,该程序可能会起作用:
// struct vec3 { float x; float y; float z; };
glUseProgram(this->program);
glUniform3f(glGetUniformLocation(this->program, name), data.x, data.y, data.z);
或
// struct vec3 { float arr[3]; };
glUseProgram(this->program);
glUniform3fv(glGetUniformLocation(this->program, name), 1, &data.arr[0]);
取决于您vec3
当然的实施情况。