【问题标题】:shaders not causing any effect - opengl着色器不会造成任何影响 - opengl
【发布时间】:2015-03-16 17:20:51
【问题描述】:

我正在尝试在另一个类中的纹理上进行渲染,但我无法查看代码。我只能访问由glGenTextures 创建的指针。

我正在尝试在此纹理上进行渲染。我正在创建自己的着色器并链接到它,但它们不会影响任何东西。我只是在手机上看到一个白屏。我在每条语句之后都放了opengl错误检查,它通过了,没有任何错误。

我想问一下,是否有任何先前附加到该纹理的着色器或类似的东西阻碍了我自己的着色器。 (我什至不知道这种说法是否有意义。)

我正在使用来自 grafika 的实用程序类来创建程序和着色器 - https://github.com/google/grafika/blob/master/src/com/android/grafika/gles/GlUtil.java。这就是为什么我很确定我的着色器相关代码没问题。

这是我的主要绘图循环 -

log("Receiving frame");
                GLES20.glUseProgram(programHandle);
                GLES20.glActiveTexture(GLES20.GL_TEXTURE2);
                GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mainTexture.glName);
//                  
                // Copy the model / view / projection matrix over.
                GLES20.glUniformMatrix4fv(muMVPMatrixLoc, 1, false, GlUtil.IDENTITY_MATRIX, 0);
                GlUtil.checkGlError("glUniformMatrix4fv");

                // Copy the texture transformation matrix over.
                /*
                GLES20.glUniformMatrix4fv(muTexMatrixLoc, 1, false, texMatrix, 0);
                GlUtil.checkGlError("glUniformMatrix4fv"); */

                // Enable the "aPosition" vertex attribute.
                GLES20.glEnableVertexAttribArray(maPositionLoc);
                GlUtil.checkGlError("glEnableVertexAttribArray");

                // Connect vertexBuffer to "aPosition".
                GLES20.glVertexAttribPointer(maPositionLoc, 2,
                    GLES20.GL_FLOAT, false, 2 * GlUtil.SIZEOF_FLOAT, GlUtil.FULL_RECTANGLE_BUF);
                GlUtil.checkGlError("glVertexAttribPointer");

                // Enable the "aTextureCoord" vertex attribute.
                GLES20.glEnableVertexAttribArray(maTextureCoordLoc);
                GlUtil.checkGlError("glEnableVertexAttribArray");

                // Connect texBuffer to "aTextureCoord".

                GLES20.glVertexAttribPointer(maTextureCoordLoc, 2,
                        GLES20.GL_FLOAT, false, 2 * GlUtil.SIZEOF_FLOAT, GlUtil.FULL_RECTANGLE_TEX_BUF);
                    GlUtil.checkGlError("glVertexAttribPointer");
                GLES20.glViewport(0, 0, parameters.getPreviewSize().width, parameters.getPreviewSize().height);
                GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

这是我的片段着色器代码 -

public static final String FRAGMENT_SHADER_2D =
        "precision mediump float;\n" +
        "varying vec2 vTextureCoord;\n" +
        "uniform sampler2D sTexture;\n" +
        "void main() {\n" +
        "    gl_FragColor[0] = 1.0;gl_FragColor[1] = 0.0;gl_FragColor[2] = 0.0;gl_FragColor[3] = 1.0;\n" +
        "}\n";

这些是坐标矩阵 -

private static final float FULL_RECTANGLE_COORDS[] = {
    -1.0f, -1.0f,   // 0 bottom left
     1.0f, -1.0f,   // 1 bottom right
    -1.0f,  1.0f,   // 2 top left
     1.0f,  1.0f,   // 3 top right
};

private static final float FULL_RECTANGLE_TEX_COORDS[] = {
    0.0f, 0.0f,     // 0 bottom left
    45.0f, 0.0f,     // 1 bottom right
    0.0f, 1.0f,     // 2 top left
    56.0f, 344.0f      // 3 top right
};

【问题讨论】:

  • 你的纹理坐标看起来很奇怪。它们通常在 0.0 到 1.0 的范围内。

标签: android opengl-es android-camera


【解决方案1】:

似乎没有任何代码可以将您的纹理连接到“sTexture”。您正在为纹理使用纹理槽 2,因此您需要告诉着色器:

GLES20.glActiveTexture(GLES20.GL_TEXTURE2);  // using texture slot 2
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mainTexture.glName);

int mSamplerLoc = GLES20.glGetUniformLocation (programHandle, "sTexture" );
GLES20.glUniform1i ( mSamplerLoc2, 2); // connect sTexture to texture slot 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多