簡體   English   中英

OpenGL,紋理輸出為純色

[英]OpenGL, Texture is outputting as a solid color

我正在嘗試對地形進行紋理處理,但似乎要么只是從紋理中選擇一種顏色,然后在各處使用它,要么使用紋理的平均顏色。 我看過其他解決方案,但他們沒有幫助我。 我是新手,所以可能是一個簡單的錯誤

紋理是從SOIL2生成的

產生紋理

int texID = SOIL_load_OGL_texture(
    filename.c_str(),
    SOIL_LOAD_AUTO,
    SOIL_CREATE_NEW_ID,
    SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
    );

生成UV坐標(刪除了對我的問題不重要的東西)

int i=0;
for (int z = 0; z < m_Size; z++) // loop through columns
{
    for (int x = 0; x < m_Size; x++) // loop through rows
    {
        model.mesh.uvs[i] = Math::Vector2(x / m_Size, z / m_Size); //Terrain is square
        i++;
    }

}

創建紋理緩沖區

if (model->mesh.numOfUVs != 0)
{
    glGenBuffers(1, &model->textureBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, model->textureBufferID);
    glBufferData(GL_ARRAY_BUFFER, model->mesh.numOfUVs * sizeof(Math::Vector2), model->mesh.uvs, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Math::Vector2), (void*)(0));     
}

繪制地形(不完整的代碼)

            glBindVertexArray(ID);

            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, model->textureID1);
            unsigned int textureLocation = glGetUniformLocation(shaderID, "grassTex");
            glUniform1i(textureLocation, 0);

            glUniformMatrix4fv(glGetUniformLocation(shaderID, "MVP"), 1, false, &newMVP.mat[0][0]);

            glDrawElements(GL_TRIANGLES, model->mesh.numOfIndices, GL_UNSIGNED_INT, (void*)0);


            glBindVertexArray(0);

垂直着色器

#version 330 core

layout(location = 0) in vec2 texturecoord;

uniform mat4 MVP;

out vec2 texcoord;

void main(){
    texcoord = texturecoord;
    gl_Position = MVP * vec4(in_position, 1);
}

碎片着色器

#version 330 core

layout(location = 0) out vec4 out_colour;

in vec2 texcoord;
uniform sampler2D grassTex;

void main()
{
    out_colour = texture2D(grassTex, texcoord);
}

如果沒有任何意義,可能是因為我刪除了很多代碼以嘗試減少發布的代碼量

它看起來像什么(圖片中有3個紋理,但是我刪除了這篇文章中的代碼,因為我認為這與使用的紋理數量無關) https://imgur.com/a/rSPp7Ru

問題是整數除法。 除以整數時,將得到一個整數。 在這里生成UV坐標。

for (int z = 0; z < m_Size; z++) // loop through columns
{
    for (int x = 0; x < m_Size; x++) // loop through rows
    {
        model.mesh.uvs[i] = Math::Vector2(x / m_Size, z / m_Size); //Terrain is square
        i++;
    }
}

xz始終小於m_Size 這意味着x / m_Sizez / m_Size始終為0因為您不能在int存儲0.2 由於您所有的UV坐標均為0, 0您只看到整個三角形上紋理的一個角(我認為它是左下角)。

要解決此問題,請將操作數之一轉換為floatdouble

model.mesh.uvs[i] = Math::Vector2(
  static_cast<float>(x) / m_Size, 
  static_cast<float>(z) / m_Size
);

如果將float除以int ,則將int提升為float因此將執行float除法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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