首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL ES2:在片段着色器中使用Mali的多个纹理

OpenGL ES2:在片段着色器中使用Mali的多个纹理
EN

Stack Overflow用户
提问于 2013-02-06 16:13:07
回答 1查看 972关注 0票数 1

我目前正在尝试让多个纹理在android上工作(使用一个碎片着色器)。它在我的Nexus4上运行良好,但在我测试过的所有三星设备上,它根本不显示矩形。问题似乎是texture2d在片段着色器代码中被调用了两次:

代码语言:javascript
复制
precision mediump float;                
uniform sampler2D uTexture;
uniform sampler2D refractTexture;       
varying vec2 vTexCoordinate;
varying vec2 vRefTexCoordinate;

void main() {
    vec2 scaleVec = vec2(0.05, 0.05);
    vec4 bumpTex = 2.0 * texture2D(refractTexture, vRefTexCoordinate) - 1.0;
    vec2 refCoords = vTexCoordinate.xy + bumpTex.xy * scaleVec;

    gl_FragColor = texture2D(uTexture, refCoords);
}

在此着色器中,我使用法线贴图(refractTexture)扭曲纹理(uTexture)。我试过使用正确的(而不是计算出来的) gl_FragColor坐标,一旦我删除了vec4 bumpTex = 2.0 * texture2D(refractTexture, vRefTexCoordinate) - 1.0;,它就会出现在设备上。

任何提示都会有所帮助。

这里请求的是我用来设置纹理的Java代码:

代码语言:javascript
复制
    mTextureUniformHandle = GLES20.glGetUniformLocation(mProgram,
            "uTexture");

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle);

    GLES20.glUniform1i(mTextureUniformHandle, 0);

    if (refractNormal && textureRefBuffer != null) {
        mTextureRefUniHandle = GLES20.glGetUniformLocation(mProgram,
                "refractTexture");

        GLES20.glActiveTexture(GLES20.GL_TEXTURE1);

        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureRefDataHandle);

        GLES20.glUniform1i(mTextureRefUniHandle, 1);

        mTextureRefCoordinateHandle = GLES20.glGetAttribLocation(mProgram,
                "aRefTexCoordinate");

        GLES20.glVertexAttribPointer(mTextureRefCoordinateHandle,
                mTextureCoordinateDataSize, GLES20.GL_FLOAT, false, 0,
                textureRefBuffer);
        GLES20.glEnableVertexAttribArray(mTextureRefCoordinateHandle);

    }

    mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgram,
            "aTexCoordinate");
    GLES20.glVertexAttribPointer(mTextureCoordinateHandle,
            mTextureCoordinateDataSize, GLES20.GL_FLOAT, false, 0,
            textureBuffer);
    GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);

顶点着色器的C代码:

代码语言:javascript
复制
        uniform mat4 uMVPMatrix;
        attribute vec4 vPosition;
        attribute vec2 aTexCoordinate;
        attribute vec2 aRefTexCoordinate;
        varying vec2 vTexCoordinate;
        varying vec2 vRefTexCoordinate;

        void main() {         
            vTexCoordinate = aTexCoordinate;
            vRefTexCoordinate = aRefTexCoordinate;
            gl_Position =   uMVPMatrix*vPosition;
        }
EN

回答 1

Stack Overflow用户

发布于 2013-02-15 04:59:14

我建议我在ARM论坛上寻求帮助,在那里有人向我索要一个示例项目。我沉重地剥离了我所拥有的,并对其进行了测试。令人惊讶的是,它在S3上运行没有问题,我在上面测试了它。我试图通过从我的原始项目中复制代码来查找问题,最终我将着色器从小项目复制到原始项目中,并以某种方式完成了这项工作。我真的不知道到底是什么导致了这个问题,但下面是为我工作的着色器代码:

代码语言:javascript
复制
        precision mediump float;
        uniform vec4 vColor;
        uniform sampler2D uTexture;
        uniform sampler2D refractTexture;   
        varying vec2 vTexCoordinate;
        varying vec2 vRefTexCoordinate;                     

        void main() {   

            vec2 scaleVec = vec2(0.05, 0.05);
            vec4 bumpTex = 2.0 * texture2D(refractTexture, vRefTexCoordinate) - 1.0;
            vec2 refCoords = vTexCoordinate.xy + bumpTex.xy * scaleVec;     
            gl_FragColor = texture2D(uTexture, refCoords);

        }

和顶点着色器:

代码语言:javascript
复制
        uniform mat4 uMVPMatrix;
        attribute vec4 vPosition;
        attribute vec2 aTexCoordinate;
        attribute vec2 aRefTexCoordinate;
        varying vec2 vTexCoordinate;
        varying vec2 vRefTexCoordinate;

        void main() {         
            vTexCoordinate = aTexCoordinate;
            vRefTexCoordinate = aRefTexCoordinate;
            gl_Position =   uMVPMatrix*vPosition;

        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14724356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档