创建带纹理的矩形失败

时间:2018-10-31 07:21:22

标签: opengl textures opengl-3 texture2d

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

  • 针对GLSL 1.3的所有操作
  • 顶点阵列中没有颜色
  • 只有一个纹理,而不是两个重叠的纹理

因此,我修改了以下代码。顶点着色器:

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

0 个答案:

没有答案