android - 着色器属性 mat4 未正确绑定(bind)(Opengl ES 2.0 Android)

标签 android opengl-es-2.0 glsl

我有以下着色器:

protected final static String vertexShaderCode =
    "attribute vec4 vPosition;" +
    "attribute vec2 texCoord;" +
    "attribute mat4 uMVPMatrix;   \n" +

    "varying vec2 vTexCoord;" +

    "void main() {" +
    "  gl_Position = uMVPMatrix * vPosition;" +
    "  vTexCoord = texCoord;" +
    "}";

我想将 mvp 矩阵作为属性传入,但它似乎没有正确绑定(bind)。我正在使用自动分配的绑定(bind)。当我按如下方式链接程序后查询属性位置时:

// program linked previously
GLES20.glUseProgram(program);
GLES20.glEnable(GLES20.GL_TEXTURE_2D);

GLES20.glEnable(GLES20.GL_BLEND);
mPositionHandle = GLES20.glGetAttribLocation(program, "vPosition");
mTextureHandle = GLES20.glGetAttribLocation(program, "texCoord");
mtextureSampHandle = GLES20.glGetAttribLocation(program, "textureSamp");
mMVPMatrixHandle = GLES20.glGetAttribLocation(program, "uMVPMatrix");

返回的句柄是:

纹理句柄:0

mMVPMatrixHandle: 1

mPositionHandle: 2

但是,从此处的文档:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindAttribLocation.xml , mMVPMatrixHandle 应分配 4 个连续句柄,矩阵的每一列一个(即 mMVPMatrix 应具有句柄 1、2、3、4)。事实并非如此,我不知道为什么...

因此,我无法在屏幕上绘制任何内容。为了完整起见,我尝试按如下方式加载矩阵:

    GLES20.glVertexAttribPointer(mMVPMatrixHandle2, 4, GLES20.GL_FLOAT, false, 0, t1);
    GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 1, 4, GLES20.GL_FLOAT, false, 0, t2);
    GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 2, 4, GLES20.GL_FLOAT, false, 0, t3);        
    GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 3, 4, GLES20.GL_FLOAT, false, 0, t4);

其中 t1-t4 是包含 mvp 矩阵各行的缓冲区:

{
    1.74f, 0, 0, 0,
    0, 2.9f, 0, 0,
    0, 0, -2.414f, -1f,
    -2.088f, 0, -2.66f, 3
}

当我将 uMVPMatrix 定义为统一的 mat4 并使用 glUniformMatrix4fv 加载它时,它会起作用。

最佳答案

原来问题不在我的卡上,而在手机上。在 Samsung Galaxy S2 上试用时,属性已正确分配并且按预期工作。

有问题的手机是 HTC Incredible S,它配备了 Adreno 205 显卡。我想一定是手机/显卡上的 Opengl 实现有问题。一种解决方案是在着色器中将矩阵定义为四个 vec4,然后逐个元素计算位置。

关于android - 着色器属性 mat4 未正确绑定(bind)(Opengl ES 2.0 Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13897232/

相关文章:

ios - 对齐顶点数据

opengl - glsl 插值限定符去哪里?

安卓。单击编辑文本时上推内容

android - 构建 Android 终端模拟器

c++ - 具有渲染到纹理 iOS : nothing shown 的 OpenGL ES 2.0 帧缓冲区

opengl - 将 vec3 乘以模型 View 矩阵

c++ - 引起问题的纹理

android - 如何在 Android 的 ListView 行上实现 onItemLongClickListener 和 onItemClickListener 事件?

java - 将 MatOfPoint2f 转换为 MatOfPoint

ios - GLSL:更改两个以上的顶点尺寸会使着色器崩溃