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

OpenGL iOS向着色器传递多个纹理

阴培
2023-03-14

目前,我有问题与传递多个纹理到一个glsl着色器在iOS。

    [self setupVBOs];
    [self compileSimpleShaders];
    [self render];
    _textureUniform = glGetAttribLocation(programHandle, "Texture");
    _textureUniform2 = glGetAttribLocation(programHandle, "Texture2");

在渲染中,想要的纹理被绑定到制服上

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(CVOpenGLESTextureGetTarget(_display.chromaTexture),
    CVOpenGLESTextureGetName(_display.chromaTexture));
    glUniform1i(_textureUniform, 0);


    glActiveTexture(GL_TEXTURE1);
    glBindTexture(CVOpenGLESTextureGetTarget(_display.lumaTexture),
              CVOpenGLESTextureGetName(_display.lumaTexture));
    glUniform1i(_textureUniform2, 0);


    glDisable(GL_BLEND);

我在这里一直使用GL_TEXTURE0和GL_TEXTURE1,因为当纹理(实际上是来自iPhone摄像头的luma和Chroma纹理,最终用于计算相应的rgb值)被创建时,这些textureLots被使用。

我使用的fragmentshader非常简单,它只是用给定的纹理对一个简单的屏幕填充四方进行纹理处理:

    varying lowp vec4 DestinationColor;
    varying lowp vec2 TexCoordsOut;

    uniform sampler2D Texture;
    uniform sampler2D Texture2;

    void main(void) {

        gl_FragColor = texture2D(Texture2,TexCoordsOut);
    }

我希望有人能在这里帮助我,看到我做错了什么,因为我根本没有看到。

共有1个答案

申宜
2023-03-14

您对两种纹理使用相同的统一位置(0)。它们必须与众不同:

glUniform1i(_textureUniform, 0);
glUniform1i(_textureUniform2, 1);

另外,如果您想创建一个纹理而不是luma和Chroma,您可以将AVCaptureVideoDataOutput videoSettings的颜色空间更改为kCVPixelFormatType_32BGRA。

 类似资料:
  • 他们没有提到的是如何首先将两个纹理传递给着色器。 以前我 所以现在我 如何将大小不同的纹理数组传递给GLSL? 将多个纹理从OpenGL传递到GLSL着色器 GLSL中的多个纹理-只有一个有效 (这是家庭作业,所以请用最少的代码片段回答(如果有的话)。谢谢!) 如果做不到这一点,有人有茶具吗?

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

  • 标准着色器 Unity 标准着色器是一个内置着色器,具有非常全面的功能。它可以用于渲染『真实世界』的对象,例如,石头、木材、玻璃、塑料和金属,并支持各种各样的着色器类型和组合。通过使用或不使用材质编辑器中的各种纹理插槽和参数,可以很容易地启动或禁用其功能。 标准着色器还包括一个称为 物理着色器(Physically Based Shading,PBS) 的高级光照模型。物理着色器以模拟真实世界的方

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

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

  • 我试图在OpenGL中制作一个场景,从太空模拟地球。我现在有两个球体,一个用于地球,另一个稍大一些用于云层。地球和云球体对象都有自己的着色器程序来保持简单。地球着色器程序采用4种纹理(白天、夜晚、specmap和normalmap),而云着色器程序采用2种纹理(cloudmap和normalmap)。我有一个对象类,它有一个渲染函数,在该函数中我使用以下逻辑: 它从第0个纹理单元开始,从GL_TE