- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 openGL 程序,并将多个模型绘制到环境中,但我不知道如何为每个模型应用不同的纹理,所以现在它们都具有相同的纹理。我读到我需要在程序中添加多个纹理单元或使用纹理图集。纹理图集似乎更复杂,所以我尝试添加纹理单元。
我认为这个过程的工作方式是:
从这里开始,我想我可以使用 glActiveTexture 告诉 openGL 我想使用哪个纹理单元。这似乎只适用于一种纹理(即跳过第 3 步),但对于两种或更多纹理则失败。
我确定我遗漏了什么,所以有人可以指出我正确的方向吗?
//Generate textures
int texturec=2;
int w[texturec],h[texturec];
unsigned char *data[texturec];
data[0]=getImage(&w[0],&h[0],"resources/a.png");
data[1]=getImage(&w[1],&h[1],"resources/b.png");
//Apply textures
GLuint textures[texturec];
glGenTextures(texturec, textures);
//Bind a.png to the first texture unit
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, w[0], h[0], 0, GL_RGB, GL_UNSIGNED_BYTE, data[0]);
//Bind b.png to the second texture unit
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, w[1], h[1], 0, GL_RGB, GL_UNSIGNED_BYTE, data[1]);
glActiveTexture(GL_TEXTURE0);
//Not super clear on what this does, but it needs to be here.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
这是我的着色器:
片段:
#version 330 core
in vec2 UV;
out vec3 color;
uniform sampler2D textureSampler;
void main(){
color=texture(textureSampler,UV).rgb;
}
顶点:
#version 330 core
layout(location=0) in vec3 vertexPos;
layout(location=1) in vec2 vertexUV;
out vec2 UV;
uniform mat4 MVP;
void main(){
gl_Position=MVP*vec4(vertexPos,1);
UV=vertexUV;
}
编辑:
这是我应用 Rabid76 的建议后的新代码:
//Generate textures
int texturec=2;
int w[texturec],h[texturec];
unsigned char *data[texturec];
data[0]=getImage(&w[0],&h[0],"resources/a.png");
data[1]=getImage(&w[1],&h[1],"resources/b.png");
//Apply textures
GLuint textures[texturec];
glGenTextures(texturec, textures);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, w[0], h[0], 0, GL_RGB, GL_UNSIGNED_BYTE, data[0]);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, w[1], h[1], 0, GL_RGB, GL_UNSIGNED_BYTE, data[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
//Shaders
programID=loadShaders("shaders/vertex.shader","shaders/fragment.shader");
glUseProgram(programID);
//Use texture unit 1
glActiveTexture(GL_TEXTURE1);
GLint texLoc=glGetUniformLocation(programID, "textureSampler");
glUniform1i(texLoc, 1);
最佳答案
- Generate two texture units with
glGenTextures
.
没有。 glGenTextures
不生成纹理单元。
glGenTextures
保留名称值,可用于纹理对象。
glBindTexture
将命名纹理绑定(bind)到纹理目标。当调用此函数时,纹理对象将绑定(bind)到当前纹理单元。
当前纹理单元可以通过glActiveTexture
设置:
例如
GLuint textures[texturec];
glGenTextures(texturec, textures);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[0]);
// [...]
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textures[1]);
// [...]
纹理对象名称值和纹理单元是完全不同的东西。
纹理单元是纹理对象和着色器程序之间的绑定(bind)点。
一方面,纹理对象必须绑定(bind)到纹理单元,另一方面,纹理单元必须设置为纹理采样器统一。所以纹理单元是两者之间的“链接”。
从 GLSL 4.2 版开始,纹理单元可以通过 Layout Qualifier (GLSL) 设置。在着色器中。 Binding point对应于纹理单元。例如binding = 1
表示纹理单元1:
layout(binding = 1) uniform sampler2D textureSampler;
或者,纹理单元索引可以通过 glUniform1i
统一分配给纹理采样器:
GLint texLoc = glGetUniformLocation(programID, "textureSampler");
glUniform1i(texLoc, 1);
如果着色器程序使用 1 个纹理采样器统一
uniform sampler2D textureSampler;
然后在绘制调用之前绑定(bind)适当的纹理对象就足够了:
glActiveTexture(GL_TEXTURE0); // this is default
glBindTexture(GL_TEXTURE_2D, textures[0]);
但是如果着色器程序使用多个纹理采样器制服(同一目标),那么不同的纹理对象必须绑定(bind)到不同的纹理单元:
例如
layout(binding = 3) uniform sampler2D textureSampler1;
layout(binding = 4) uniform sampler2D textureSampler2;
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, textures[1]);
分别
layout(location = 7) uniform sampler2D textureSampler1;
layout(location = 8) uniform sampler2D textureSampler2;
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glUseProgram(programID);
glUniform1i(7, 3); // location = 7 <- texture unit 3
glUniform1i(8, 4); // location = 8 <- texture unit 4
关于c++ - 如何向我的 openGL 程序添加多个纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55800355/
我是一名优秀的程序员,十分优秀!