[英]Texture rendering and VBO's [OpenGL/SDL/C++]
因此,我已經在一個小游戲項目上工作了一段時間,但遇到了一個困擾,使我無休止。 我加載一個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);
}
}
}
還有我的着色器文件...
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);
}
Shader.vert
void main() {
gl_TexCoord[0] = gl_MultiTexCoord0;
// Set the position of the current vertex
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
是的,我知道我的render loop:P目前效率很低,但是我已經在計划重構它,我只是想讓這個單一模型正確地繪制出我打算做的所有事情。 我不知道為什么不能正確應用紋理來渲染-除非是因為我需要交織數組,但是我仍在向它提供uv數據,所以我不明白為什么它會失敗。
設置采樣器統一的調用不應設置GL_TEXTUE0,而實際上應設置為0。
確實:
glUniform1i(location, 0)
要設置采樣器制服,請執行以下操作:
glUseProgram(progId);
// ...
glActiveTexture(GL_TEXTURE0 + texUnit);
glBindTexture(texId);
glUniform1i(texUnit);
主要概念是統一變量是着色器程序狀態(在重新鏈接程序或重置統一值之前一直保持該狀態)。 如果不綁定程序,glUniform1i將失敗,因為沒有可用於設置統一值的着色器程序!
作為一般建議,在每個OpenGL調用之后調用glGetError來檢測這些情況。 發行版本中的預處理器可以刪除其中大部分的調用。
好吧,發現最大的問題是,當我綁定紋理時,我實際上並沒有以被理解為被使用的方式對其進行設置。 設置glClientActiveTexture(GL_TEXTURE0 + texUnit); 與glActiveTexture()結合使用; 最終成為最終解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.