簡體   English   中英

紋理渲染和VBO的[OpenGL / SDL / C ++]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM