C++ C++;纹理显示不正确:合并为一种颜色

C++ C++;纹理显示不正确:合并为一种颜色,c++,opengl,textures,vbo,vao,C++,Opengl,Textures,Vbo,Vao,我正在尝试对VBO/VAO模型立方体进行纹理处理。立方体绝对渲染/绘制正确,据我所知,我正在做加载纹理所需的一切 但是,在应用纹理时,它似乎对纹理中的所有颜色进行平均,然后将该平均值应用于整个立方体。这使得它看起来像是用普通、规则的颜色“绘制”的,如下面的屏幕截图所示: 这就是纹理 我不知道为什么会这样。下面是我的init、loadTexture和display函数的代码(我没有编写loadTexture函数): 初始化函数 (仅显示与立方体+纹理相关的代码) void init(void)

我正在尝试对VBO/VAO模型立方体进行纹理处理。立方体绝对渲染/绘制正确,据我所知,我正在做加载纹理所需的一切

但是,在应用纹理时,它似乎对纹理中的所有颜色进行平均,然后将该平均值应用于整个立方体。这使得它看起来像是用普通、规则的颜色“绘制”的,如下面的屏幕截图所示:

这就是纹理

我不知道为什么会这样。下面是我的init、loadTexture和display函数的代码(我没有编写loadTexture函数):

初始化函数 (仅显示与立方体+纹理相关的代码) void init(void){ . . . pyramidTexture=TextureLoader::fiLoadTexture(wstring(L“Common\Resources\Textures\sandson.png”)

加载纹理功能

我一直在努力解决这个问题,现在没有任何运气,因为这样的任何支持将不胜感激

编辑:添加到VAO属性+着色器中

VAO设置

顶点着色器

片段着色器


您将数据定义为
无符号短字符

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);