C++ C++;纹理显示不正确:合并为一种颜色
我正在尝试对VBO/VAO模型立方体进行纹理处理。立方体绝对渲染/绘制正确,据我所知,我正在做加载纹理所需的一切 但是,在应用纹理时,它似乎对纹理中的所有颜色进行平均,然后将该平均值应用于整个立方体。这使得它看起来像是用普通、规则的颜色“绘制”的,如下面的屏幕截图所示: 这就是纹理 我不知道为什么会这样。下面是我的init、loadTexture和display函数的代码(我没有编写loadTexture函数): 初始化函数 (仅显示与立方体+纹理相关的代码) void init(void){ . . . pyramidTexture=TextureLoader::fiLoadTexture(wstring(L“Common\Resources\Textures\sandson.png”) 加载纹理功能 我一直在努力解决这个问题,现在没有任何运气,因为这样的任何支持将不胜感激 编辑:添加到VAO属性+着色器中 VAO设置 顶点着色器 片段着色器C++ C++;纹理显示不正确:合并为一种颜色,c++,opengl,textures,vbo,vao,C++,Opengl,Textures,Vbo,Vao,我正在尝试对VBO/VAO模型立方体进行纹理处理。立方体绝对渲染/绘制正确,据我所知,我正在做加载纹理所需的一切 但是,在应用纹理时,它似乎对纹理中的所有颜色进行平均,然后将该平均值应用于整个立方体。这使得它看起来像是用普通、规则的颜色“绘制”的,如下面的屏幕截图所示: 这就是纹理 我不知道为什么会这样。下面是我的init、loadTexture和display函数的代码(我没有编写loadTexture函数): 初始化函数 (仅显示与立方体+纹理相关的代码) void init(void)
您将数据定义为
无符号短字符
:
static unsigned short pyramidTexCoordArray[24]
但是它必须是
浮点数
您将数据定义为无符号短点数
:
static unsigned short pyramidTexCoordArray[24]
但是它必须是浮动的,有很多奇怪的事情: 您正在为纹理坐标生成3个VBO,但只使用了一个。除非pyramidTexCoordBuffer的类型为GLuint[3](我认为这不是由于&),否则您的写入超出了边界 编辑:这是指
glGenBuffers(3,&pyramitexcoordbuffer);
行,它分配3个缓冲区,并将它们存储在从pyramitexcoordbuffer
开始的三个连续GLuint
变量中。由于pyramitexcoordbuffer
很可能是GLuint
,因此pyramitexcoordbuffer[1]
和pyramitexCoordBuffer[2]
指未分配的内存
pyramitexCoordArray
数组被指定为unsigned short
,但您正在向它写入浮点数。由于它是无符号的,至少负数将消失
此外,您还可以使用
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)0);
数据类型为
GL_FLOAT
(并非如此)且每个顶点有两个浮动(但数据每个顶点有3个元素):有很多奇怪的事情:
您正在为纹理坐标生成3个VBO,但只使用了一个。除非pyramidTexCoordBuffer的类型为GLuint[3](我认为这不是由于&),否则您的写入超出了边界
编辑:这是指glGenBuffers(3,&pyramitexcoordbuffer);
行,它分配3个缓冲区,并将它们存储在从pyramitexcoordbuffer
开始的三个连续GLuint
变量中。由于pyramitexcoordbuffer
很可能是GLuint
,因此pyramitexcoordbuffer[1]
和pyramitexCoordBuffer[2]
指未分配的内存
pyramitexCoordArray
数组被指定为unsigned short
,但您正在向它写入浮点数。由于它是无符号的,至少负数将消失
此外,您还可以使用
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)0);
数据类型为
GL_FLOAT
(不是)且每个顶点有两个浮动(但数据每个顶点有3个元素)的行:如果看不到您使用的纹理坐标和着色器,我们将无能为力。请您提供网格数据和着色器源好吗?很抱歉,我知道我忘记了一些东西。数据已添加到底部,使用着色器查找我,好像uv坐标在曲面上是恒定的。是的,我对坐标有点困惑(我朋友的纹理在工作,所以他让我借用他的代码,我打算在纹理工作时把坐标整理出来!)如果看不到您使用的纹理坐标和着色器,我们无法帮助您。请您提供网格数据和着色器源好吗?抱歉,我知道我忘记了什么。数据已添加到底部,使用着色器查找我,好像uv坐标在曲面上是恒定的。是的,我对坐标有点困惑(我朋友的纹理在工作,所以他让我借用他的代码,我打算在纹理工作时把坐标整理出来!)它必须是?如果使用GL_UNSIGNED_SHORT呢?OP用浮点数据初始化它,并将其解释为浮点,实际上存储负值,所以是的,它必须是float
。这解决了我的问题!非常感谢!它必须是?如果使用GL_UNSIGNED_SHORT呢?OP用浮点数据初始化它并解释它它是浮动的,实际上存储的是负值,所以是的,它必须是float
。这解决了我的问题!非常感谢!他没有使用3个VBO作为纹理坐标,是吗?他使用3个VBO,但用于不同的数据。如果我正确理解VAO/VBO,我将使用1个VBO存储顶点位置,1个VBO用于颜色,1个用于纹理Coords。但是将unsigned short更改为float已经解决了这个问题。纹理现在可以正确显示了,非常感谢!我也不确定为什么(或者是否)我需要3组Coords(我认为纹理Coords是u,v,所以我删除了第三个值,它似乎仍然有效。现在只需计算出正确的Coords:))我指的是这一行:glGenBuffers(3,&pyramitexcoordbuffer);
,它分配3个缓冲区,并将它们存储在从pyramitexcoordbuffer
开始的三个连续GLuint
变量中。因为pyramitexcoordbuffer
很可能是GLuint
,pyramitexcoordbuffer[1]
和pyramitexCoordBuffer[2]
#version 330 uniform mat4 mvpMatrix; layout (location=0) in vec4 vertexPos; layout (location=3) in vec2 vertexTexCoord; out vec2 texCoord; void main(void) { mat4 M; M[0] = vec4(1.0); ivec2 a = ivec2(1, 2); //vec3 b = vec3(2.0, 4.0, 1.0) + a; texCoord = vertexTexCoord; gl_Position = mvpMatrix * vertexPos; }
#version 330
uniform sampler2D texture;
in vec2 texCoord;
layout (location=0) out vec4 fragColour;
void main(void) {
vec4 texColor = texture2D(texture, texCoord);
fragColour = texColor;
}
static unsigned short pyramidTexCoordArray[24]
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)0);