[英]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++;
}
}
x
和z
始終小於m_Size
。 這意味着x / m_Size
和z / m_Size
始終為0
因為您不能在int
存儲0.2
。 由於您所有的UV坐標均為0, 0
您只看到整個三角形上紋理的一個角(我認為它是左下角)。
要解決此問題,請將操作數之一轉換為float
或double
。
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.