GlTexImage2D什么都不做

时间:2015-07-05 18:39:49

标签: opengl-es-2.0

我已经尝试了数百万种组合将纹理传递给着色器而没有任何成功。这是一个应该在视频上添加第二个纹理的代码(OES_EXTERNAL_TEXTURE)。没有GL错误(我已经验证了所有通话)。显示外部纹理(视频),但着色器(0,0,0,1f)中的其他纹理始终为黑色。

这就是我启动“覆盖”的方式。质地。

            _texs = new int[1];
            GLES20.GlGenTextures (1, _texs, 0);
            _overlayId = _texs [0];

            GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureMinFilter,
                GLES20.GlNearest);
            GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureMagFilter,
                GLES20.GlLinear);
            GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureWrapS,
                GLES20.GlClampToEdge);
            GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureWrapT,
                GLES20.GlClampToEdge);

            GLES20.GlBindTexture(GLES20.GlTexture2d, _overlayId);

            GLES20.GlTexImage2D (GLES20.GlTexture2d, 0, GLES20.GlRgb, textureSide, textureSide, 0, GLES20.GlRgb, GLES20.GlUnsignedByte, ByteBuffer.Wrap(pixels));
            _overlayPosition = GLES20.GlGetUniformLocation (_glProgram, "overlay");
            GLES20.GlUniform1i (_overlayPosition, _overlayId);

            GLES20.GlBindTexture (GLES20.GlTexture2d, 0);

这就是我画画的方式:

            GLES20.GlBindTexture(GLES20.GlTexture2d, _overlayId);
            _overlayPosition = GLES20.GlGetUniformLocation (_glProgram, "overlay");
            GLES20.GlUniform1i (_overlayPosition, _overlayId);

            GLES20.GlBindTexture(GL_TEXTURE_EXTERNAL_OES, _textureID    );
            _triangleVertices.Position (TRIANGLE_VERTICES_DATA_POS_OFFSET);
            GLES20.GlVertexAttribPointer (_aPositionHandle, 3, GLES20.GlFloat, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, _triangleVertices);
            GLES20.GlEnableVertexAttribArray (_aPositionHandle);

            _textureVertices.Position (TRIANGLE_VERTICES_DATA_UV_OFFSET);
            GLES20.GlVertexAttribPointer (_aTextureCoord, 2, GLES20.GlFloat, false, TEXTURE_VERTICES_DATA_STRIDE_BYTES, _textureVertices);
            GLES20.GlEnableVertexAttribArray (_aTextureCoord);

            Android.Opengl.Matrix.SetIdentityM (_MVPMatrix, 0);
            GLES20.GlUniformMatrix4fv (_uMVPMatrixHandle, 1, false, _MVPMatrix, 0);
            GLES20.GlUniformMatrix4fv (_uSTMatrixHandle, 1, false, _STMatrix, 0);

            GLES20.GlDrawArrays(GLES20.GlTriangleStrip, 0, 4);

[编辑]

最后得到了sampler2d纹理:

(在纹理初始化部分中)创建纹理:

            _texs = new int[1];
            GLES20.GlGenTextures (1, _texs, 0);
            _overlayTextureId = _texs [0];

获得统一的位置:

            _overlayTextureUniform = GLES20.GlGetUniformLocation (_glProgram, "overlay");

这些参数是必需的,仅此而已:

            GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureMinFilter, GLES20.GlNearest);
            GLES20.GlTexParameteri(GLES20.GlTexture2d, GLES20.GlTextureMagFilter, GLES20.GlLinear);

从位图创建纹理:

            GLUtils.TexImage2D (GLES20.GlTexture2d, 0, myBitmap, 0);

在OpenGL上下文中设置纹理。这是一个帮手。

            setTexture2D (_overlayTextureUnit, _overlayTextureId, _overlayTextureUniform); 

释放该位图:

            source.Recycle ();

=纹理初始化结束=

这是我帮手的代码:

       void setTexture2D(int textureUnit, int textureID, int uniformID) {
            GLES20.GlActiveTexture(GLES20.GlTexture0 + textureUnit);
            GLES20.GlBindTexture(GLES20.GlTexture2d, textureID);
            GLES20.GlUniform1i(uniformID, textureUnit);
        }

此代码有什么特别之处吗?不。我以前的尝试是否编码良好?没有。两件事情有很大帮助:1。上面的小助手,用于在初始化和onDrawFrame中设置OES和2D纹理。 2.调试图像我传递给GlTexImage2D方法,最终碰巧真的是黑色。我将像素从float更改为int,并在使用算术之前转换为int,它具有0或255个值。

0 个答案:

没有答案