anf*_*0us 2 c++ opengl sdl glsl
所以,我一直在研究一个小小的游戏项目,我遇到了一个令我讨厌的问题.我加载一个obj文件,然后在放入VBO后呈现.这部分工作正常,没有问题.但是,我一直试图让它用提供的UV渲染伴随纹理但没有成功.目前,我只是在我的模型上获得了一个哑光绿色.在GDE中调查它时,我已经看到纹理被正确加载并占据了GL_TEXTURE0单元,所以这不是问题.我相信这可能是我的约束力,但我不知道为什么会失败......
void Model_Man::render_models()
{
for(int x=0; x<models.size(); x++)
{
if(models.at(x).visible==true)
{
glBindBuffer(GL_ARRAY_BUFFER,models.at(x).t_buff);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,models.at(x).i_buff);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT,0,0);
glClientActiveTexture(GL_TEXTURE0);
glTexCoordPointer(2,GL_FLOAT,0,&models.at(x).uvs[0]);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glActiveTexture(GL_TEXTURE0);
int tex_loc = glGetUniformLocation(models.at(x).shaderid,"color_texture");
glUniform1i(tex_loc,GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, models.at(x).mats.at(0).texid);
c_render.use_program(models.at(x).shaderid);
glDrawElements(GL_TRIANGLES,models.at(x).f_index.size()*3,GL_UNSIGNED_INT,0);
c_render.use_program();
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的着色器文件......
Shader.frag
uniform sampler2D color_texture;
void main() {
// Set the output color of our current pixel
gl_FragColor = texture2D(color_texture, gl_TexCoord[0].st);
}
Run Code Online (Sandbox Code Playgroud)
Shader.vert
void main() {
gl_TexCoord[0] = gl_MultiTexCoord0;
// Set the position of the current vertex
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)
是的,我知道我的渲染循环目前效率非常低:P但我已经计划重构它,我只是试图让这个单一模型正确地绘制我想要做的一切.我不知道为什么它不能正确应用纹理渲染 - 除非是因为我需要交错我的数组但我仍然提供它与uv数据所以我不明白为什么它失败.
设置采样器均匀的调用不应设置GL_TEXTUE0,而是实际为0.
确实:
glUniform1i(location, 0)
Run Code Online (Sandbox Code Playgroud)
要设置采样器制服,请执行以下操作:
glUseProgram(progId);
// ...
glActiveTexture(GL_TEXTURE0 + texUnit);
glBindTexture(texId);
glUniform1i(texUnit);
Run Code Online (Sandbox Code Playgroud)
主要概念是统一变量是着色器程序状态(在重新链接程序或重置统一值之前,它会被保留).如果没有绑定程序,glUniform1i将失败,因为没有着色器程序可以设置统一值!
作为一般建议,在每次OpenGL调用后调用glGetError来检测这些条件.大多数调用可以在发布版本中通过预处理器删除.