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://i.stack.imgur.com/kPfWt.jpg
问题是整数除法。当你除整数时,你会得到一个整数。这是您生成 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
,因为您无法将0.2
存储在int
中。由于您所有的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
以便执行除法。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 将 MFC 图像初始化为纯色
- 如何让控制台输出覆盖控制台而不是纯文本输出?
- vkCmdCopyImageToBuffer 生成纯色图像
- SystemParametersInfo将背景设置为纯色,而不是实际设置图片
- 如何在 Win32 应用中拖动纯色矩形,而不会产生白色闪烁,也不会干扰其他屏幕对象
- OpenGL,纹理输出为纯色
- 试图显示纹理,但只能使用OpenGL获得纯色
- 为什么 int -> 十六进制/oct/bin 的转换在输出中打印为纯十进制值?
- 用c++创建一个单一的纯色图像
- 照明不工作在OpenGL -纯色
- 在纹理/纯色中绘制透明孔
- 如果无法加载纹理,则退回到纯色