我正在尝试在OpenGL 3中渲染2个纹理。我创建了两个GLfloat类型的顶点数组,生成并绑定了缓冲区等。
注意:纹理加载功能运行良好,我之前已经加载了一个纹理,现在只需要同时渲染两个纹理即可。
然后我像这样加载我的纹理:
GLuint grass = texture.loadTexture("grass.bmp");
GLuint grassLoc = glGetUniformLocation(programID, "grassSampler");
glUniform1i(grassLoc, 0);
GLuint crate = texture.loadTexture("crate.bmp");
GLuint crateLoc = glGetUniformLocation(programID, "crateSampler");
glUniform1i(crateLoc, 1);
这是我绘制它们的方式:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, grass);
glDrawArrays(GL_TRIANGLES, 0, 6);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, crate);
glDrawArrays(GL_TRIANGLES, 2, 6);
顶点着色器:
#version 330 core
layout(location = 0) in vec3 grassPosition;
layout(location = 1) in vec2 grassUvPosition;
layout(location = 2) in vec3 cratePosition;
layout(location = 3) in vec2 crateUvPosition;
out vec2 grassUV;
out vec2 crateUV;
uniform mat4 MVP;
void main(){
gl_Position = MVP * vec4(grassPosition,1);
gl_Position = MVP * vec4(cratePosition,1);
grassUV = grassUvPosition;
crateUV = crateUvPosition;
}
片段着色器:
#version 330 core
in vec2 grassUV;
in vec2 crateUV;
out vec3 grassColor;
out vec3 crateColor;
uniform sampler2D grassSampler;
uniform sampler2D crateSampler;
void main(){
crateColor = texture(grassSampler, grassUV).rgb;
grassColor = texture(crateSampler, crateUV).rgb;
}
谁能看到我做错了吗?
编辑:我正在尝试在2个不同的VAO上渲染2个不同的纹理
你有点做的一切错误的; 很难挑出一件事。
您的着色器看起来像是要占据两个位置和两个纹理坐标,大概会生成两个三角形,然后从两个纹理中采样并将颜色写入两个不同的图像。
那不是它的工作原理。除非您使用几何体着色器(并且请勿将其用作认可)glDrawArrays(GL_TRIANGLES, 0, 6);
,否则无论您的VS或FS怎么说,您对的调用都将精确渲染2个三角形。
顶点只有一个位置。gl_Position
两次写入只会覆盖先前的值,就像在C ++中两次写入任何变量一样。并且要渲染的三角形数量由顶点数量定义。顶点着色器无法创建顶点。它甚至无法销毁它们(尽管通过gl_CullDistance
,它可能会剔除整个原始体)。
您不清楚“我只需要同时渲染2个纹理”是什么意思。或更确切地说,“同时”指的是什么。我不知道您的代码应该做什么。
给定您的顶点着色器所需的数据,看起来您有两组单独的三角形,分别具有它们的位置和纹理坐标。您想用一种纹理渲染一组三角形,然后用另一种纹理渲染另一组。
所以... 不必让您的VAO发送2个位置和2个纹理坐标,而仅发送1个。您的VS还应占据一个位置/ texcoord,而FS则应类似地采用单个纹理并写入单个输出。差异取决于您发出渲染调用时当前正在激活的VAO以及绑定到纹理单元0的纹理。
如果您确实打算按照FS的建议写入不同的输出图像,则也应在渲染之间更改FBO。
但是,如果您的目标是使同一个三角形使用带有两个贴图的两个纹理,将单独的结果写入两个图像,您也可以这样做。所不同的是,你只提供一个单一的位置,当你发出你的渲染命令贴图必须同时绑定个纹理单元0和1。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句