首页 > 解决方案 > 创建带纹理的矩形失败

问题描述

我想在 OpenGL 3.0 中绘制一个带有纹理的简单矩形。作为起点,我使用https://learnopengl.com/code_viewer_gh.php?code=src/1.getting_started/4.2.textures_combined/textures_combined.cpp中的示例,但进行了一些修改:

所以我修改了这段代码如下。顶点着色器:

#version 130
in vec3 aPos;
in vec2 aTexCoord;
out vec2 TexCoord;
uniform mat4 inputTransform;
void main()
{
   TexCoord=vec2(aTexCoord.x, aTexCoord.y);
   gl_Position = inputTransform * vec4(aPos.x, aPos.y, aPos.z, 1.0);
}

片段着色器:

#version 130
out vec4 FragColor;
in vec2 TexCoord;
uniform sampler2D texture1;
void main()
{
   FragColor=texture(texture1, TexCoord);
}

-> 他们都编译没有错误

我的顶点坐标使用 x,y,z,u,v 排列在一个数组中:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);

基于 GL_TRIANGLE_STRIP 的矩形(没有 UV 坐标和没有纹理的东西)运行良好并且具有正确的大小,但是一旦我应用纹理坐标和函数调用它,只绘制一个非常小的三角形。

所以我猜我的顶点数组中的坐标出了点问题。但是......这里到底有什么问题?

更新:我的 VBO/VAO 设置(简化,因此未显示错误处理代码):

gl3Element->shaderProgram=glCreateProgram();
glAttachShader(gl3Element->shaderProgram, m_gl3TexVertexShader);
glAttachShader(gl3Element->shaderProgram,m_gl3TexFragmentShader);
glLinkProgram(gl3Element->shaderProgram);
glDeleteShader(m_gl3TexFragmentShader);
glDeleteShader(m_gl3DynColourFragmentShader);
glUseProgram(gl3Element->shaderProgram);
glGenVertexArrays(1, &gl3Element->VAO);
glGenBuffers(1, &gl3Element->VBO);

...以及起诉他们的纹理特定的东西:

glGenTextures(1, &imgEntity->m_glTexture);
glBindTexture(GL_TEXTURE_2D, imgEntity->m_glTexture);

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,transImage->GetWidth(),transImage->GetHeight(),0,GL_RGB,GL_UNSIGNED_BYTE,transImage->GetData());

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenerateMipmap(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, imgEntity->m_glTexture);

标签: opengltexturesopengl-3texture2d

解决方案


推荐阅读