当前位置: 首页 > 知识库问答 >
问题:

如何将多个纹理传递给单个着色器?

郭鸿信
2023-03-14
uniform sampler2D DecalTex; //The texture
uniform sampler2D BumpTex; //The bump-map 

他们没有提到的是如何首先将两个纹理传递给着色器。

以前我

//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);

//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;

//Fragment shader
gl_FragColor = color * texture2D(DecalTex,gl_TexCoord[0].xy);

所以现在我

//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);
glBindTexture(GL_TEXTURE_2D, bumpHandle);

//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;

//Fragment shader
gl_FragColor = color * texture2D(BumpTex,gl_TexCoord[0].xy);
//no bump logic yet, just testing I can use texture 1 instead of texture 0
  • 如何将大小不同的纹理数组传递给GLSL?
  • 将多个纹理从OpenGL传递到GLSL着色器
  • GLSL中的多个纹理-只有一个有效

(这是家庭作业,所以请用最少的代码片段回答(如果有的话)。谢谢!)

如果做不到这一点,有人有茶具吗?

共有1个答案

钮承恩
2023-03-14

很简单,真的。您所需要的就是使用gluniform1i将采样器绑定到某个纹理单元。所以对于您的代码示例,假设有两个统一的采样器:

uniform sampler2D DecalTex;  // The texture  (we'll bind to texture unit 0)
uniform sampler2D BumpTex;   // The bump-map (we'll bind to texture unit 1)

在初始化代码中:

// Get the uniform variables location. You've probably already done that before...
decalTexLocation = glGetUniformLocation(shader_program, "DecalTex");
bumpTexLocation  = glGetUniformLocation(shader_program, "BumpTex");

// Then bind the uniform samplers to texture units:
glUseProgram(shader_program);
glUniform1i(decalTexLocation, 0);
glUniform1i(bumpTexLocation,  1);

好的,着色器制服设置,现在我们渲染。为此,您将需要通常的glbindtextureglactivetexture:

glActiveTexture(GL_TEXTURE0 + 0); // Texture unit 0
glBindTexture(GL_TEXTURE_2D, decalTexHandle);

glActiveTexture(GL_TEXTURE0 + 1); // Texture unit 1
glBindTexture(GL_TEXTURE_2D, bumpHandle);

// Done! Now you render normally.
vec4 a = texture2D(DecalTex, tc);
vec4 b = texture2D(BumpTex,  tc);
 类似资料:
  • 我跟着教程上了课https://learnopengl.com/Lighting/Lighting-maps当使用多个纹理(一个用于镜面反射,一个用于漫反射照明)时,会出现一些奇怪的错误。当只使用一种纹理时,一切正常,但在使用两种纹理后,立方体只渲染黑色或只应用镜面反射纹理。 我在stackoverflow上搜索了所有类似的问题,并阅读了OpenGL文档,但仍然无法找出第二种纹理不起作用的原因。

  • 目前,我有问题与传递多个纹理到一个glsl着色器在iOS。 在渲染中,想要的纹理被绑定到制服上 我在这里一直使用GL_TEXTURE0和GL_TEXTURE1,因为当纹理(实际上是来自iPhone摄像头的luma和Chroma纹理,最终用于计算相应的rgb值)被创建时,这些textureLots被使用。 我使用的fragmentshader非常简单,它只是用给定的纹理对一个简单的屏幕填充四方进行纹

  • 我正在写我的学生项目,有一些问题。 我的任务是加载两个大小相同的纹理(图像和灰度掩码),然后应用基于灰度掩码的卷积核模糊滤波器。 提前谢谢你。

  • 我正在QT-QML-3D中用C开发一个应用程序。我需要将数十个浮点值(或浮点数向量)传递给片段着色器。这些值是灯光的位置和颜色,所以我需要更多的值,范围从0.0到1.0。但是,不支持将浮点或整数数组传递给QML中的着色器。我的想法是将浮动保存到纹理,将纹理传递到着色器,并从中获取值。 我试过这样的方法: 并将此QImage作为sampler2D传递给片段着色器。但是有没有像memcpy这样的方法可

  • 在一个简单的hello world OpenGL程序中,它只是在窗口上绘制一个静态三角形,当我将三角形的3个顶点设置为红色、绿色和蓝色时,三角形将填充渐变。 但是当我使用这样的着色器时: 顶点着色器: 其中属性和来自顶点缓冲区,通过的调用传递。 片段着色器: 三角形仍然充满了梯度,问题来了: 如果顶点着色器是按顶点计算的,则应为的每个实例指定顶点的颜色。顶点颜色应为红色、绿色或蓝色,如顶点缓冲区中

  • 我有一个纹理网格,它有一个特定的三角形列表,这些三角形对应于网格上的面,在运行时使用如下代码重新着色: 它的工作很好,但我原本打算这些脸是一个明亮的蓝色。不幸的是,着色似乎与我在Unity中分配给网格的材质纹理混合在一起。在这里你可以看到纹理上的绿草和看起来相当绿的“蓝”混在一起: 我试过玩灯光,但这似乎不是问题。我得到的网格着色需要使用特定的着色器,所以我为网格分配了着色器。 有没有办法在运行时