【发布时间】:2019-08-29 17:18:49
【问题描述】:
我想用两个纹理绘制对象矩形和只有一个纹理的三角形。我关注这个网站
LearnOpenGL.com - Textrues
https://learnopengl.com/code_viewer_gh.php?code=src/1.getting_started/4.2.textures_combined/textures_combined.cpp
使用绘制三角形,我实现如下:
Shader ourShaderTriangle("vshader.glsl", "fshader.glsl");
float firstTriangle[] = {
// positions // colors //textcoord
-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // bottom right
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.5f, 1.0f, // bottom left
-0.1f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f // top
};//first
unsigned int VBO1, VAO1;
glGenVertexArrays(1, &VAO1);
glGenBuffers(1, &VBO1);
glBindVertexArray(VAO1);
glBindBuffer(GL_ARRAY_BUFFER, VBO1);
glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangle), firstTriangle, GL_STATIC_DRAW);
//position
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//color
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
//textCoord
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(2);
顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
out vec3 ourColor;
out vec2 TexCoord;
void main()
{
gl_Position = vec4(aPos, 1.0);
ourColor = aColor;
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}
片段:
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 TexCoord;
uniform sampler2D textureTriangle;
void main()
{
FragColor = texture(textureTriangle, TexCoord);
}
加载纹理:我使用其他纹理“container2.png”。我将它存储在“texture3”中
glGenTextures(1, &texture3);
glBindTexture(GL_TEXTURE_2D, texture3);
// set the texture wrapping parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // set texture wrapping to GL_REPEAT (default wrapping method)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// set texture filtering parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// load image, create texture and generate mipmaps
data = stbi_load(FileSystem::getPath("resources/textures/container2.png").c_str(), &width, &height, &nrChannels, 0);
if (data)
{
// note that the awesomeface.png has transparency and thus an alpha channel, so make sure to tell OpenGL the data type is of GL_RGBA
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);
在绘图功能中:
//bind textures on corresponding texture units
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture2);
// render container
ourShader.use();
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
//
ourShaderTriangle.use();
glBindTexture(GL_TEXTURE_2D, texture3);
glBindVertexArray(VAO1);
glDrawArrays(GL_TRIANGLES, 0, 3);
//
但三角形仍在使用纹理单元 0 (GL_TEXTURE0)。不使用我想要的纹理
我曾尝试使用“glDisable”和“glDeleteTextures”,但它不起作用。
你能帮帮我吗?
【问题讨论】:
-
你在哪里告诉片段着色器,通过使用
glUniform1i(...),关于要使用的纹理(uniform sampler2D textureTriangle)? -
texture3绑定到纹理单元 1,因为当前纹理单元在glActiveTexture(GL_TEXTURE1);之后没有更改。如果纹理采样器"textureTriangle"应该与纹理单元1 相关联,那么您必须将1 分配给纹理采样器制服GLint tex_loc=glGetUniformLocation(program, "textureTriangle");glUniform1i(tex_loc, 1);。制服必须设置在ourShaderTriangle.use();之后。 -
每次调用
glBindTexture时,它都会将该纹理放入当前的Active 纹理中。最后一次调用glActiveTexture将active 纹理更改为GL_TEXTURE1。然后你绑定texture2绘制四边形,然后texture3绘制三角形。三角形着色器看到texture1绑定到GL_TEXTURE0和texture3绑定到GL_TEXTURE1。尝试在绑定texture3之前添加对glActiveTexture(GL_TEXTURE0)的调用。