opengl - 创建带纹理的矩形失败
问题描述
我想在 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);
解决方案
推荐阅读
- bash - Bash/Rust 问题:从 Bash 运行火焰图工作,从 Rust 失败
- wpf - 如何更新 wpf DataGrid 中的 DatePicker 值
- java - 在具有持久卷的 Kubernetes 中的 Docker 上运行时,Hadoop Java 失败
- php - Eloquent 模型关系不返回子关系特定的列值
- python - 装饰器有奇怪的行为
- dialogflow-es-fulfillment - 到 mongodb 的连接字符串
- java - Java最终字符串参数未标记为lambda表达式中的编译时错误
- jib - 为什么 Jib 放弃了对 distroless 基础镜像的支持?
- python - 如何确保在while循环中只扣除一次int(python3)
- rust - 为什么 to_be_bytes() 和 to_le_bytes() 与我在这里期望的相反?