android - 使用矩阵作为顶点着色器属性时崩溃

标签 android opengl-es vertex-shader

我正在尝试创建一个 OpenGL 顶点着色器,它对每个顶点都有一个额外的变换矩阵。我的着色器代码如下所示:

uniform mat4 mvpMatrix;

attribute vec3 coordinates;
attribute mat4 vertexTransformation;
attribute vec4 vertexColor;

varying vec4 v_color;

void main() 
{
    vec4 pos = vec4( coordinates, 1 );

    pos = vertexTransformation * pos;
    pos = mvpMatrix * pos;
    gl_Position = pos;

    v_color = color;
}

每当我在 android 模拟器中执行此操作时,模拟器就会崩溃。

我试图找出问题并发现它会在我访问 vertexTransformation 属性时发生。即使不涉及进一步的矩阵运算,以下代码也会导致崩溃。

uniform mat4 mvpMatrix;

attribute vec3 coordinates;
attribute mat4 vertexTransformation;
attribute vec4 vertexColor;

varying vec4 v_color;

void main() 
{
    vec4 pos = vec4( coordinates, 1 );

    pos = mvpMatrix * pos;
    gl_Position = pos;

    vec4 col = vec4( 0,0,0,1 );
    if ( vertexTransformation[0][0] == 0.5 )
        v_color = color;
    else
        v_color = vec4( 1, 1, 1, 1 );    
}    

我正在使用 glBufferData 来传递数据:

ByteBuffer vertexData = ...;
vertexData.position( 0 );

GLES20.glBufferData( GLES20.GL_ARRAY_BUFFER, vertexData.remaining(), vertexData, GLES20.GL_STATIC_DRAW );

然后用

绑定(bind)属性
int handle = GLES20.glGetAttribLocation( programId, "vertexTransformation" );
GLES20.glEnableVertexAttribArray( handle );
GLES20.glVertexAttribPointer( handle, 16, GLES20.GL_FLOAT, false, 92, 28 );

我做错了什么?有什么方法可以为顶点提供矩阵属性并在顶点着色器中使用它们吗?

最佳答案

这段代码是错误的:

int handle = GLES20.glGetAttribLocation( programId, "vertexTransformation" );
GLES20.glEnableVertexAttribArray( handle );
GLES20.glVertexAttribPointer( handle, 16, GLES20.GL_FLOAT, false, 92, 28 );

OpenGL 中的顶点属性始终是 4 分量的,因此 mat4 顶点属性实际上是 4 个连续的 4 分量数组。

这是处理 mat4 顶点属性的正确方法:

int handle = GLES20.glGetAttribLocation( programId, "vertexTransformation" );

GLES20.glEnableVertexAttribArray( handle );
GLES20.glVertexAttribPointer( handle, 4, GLES20.GL_FLOAT, false, 92, 28 );

GLES20.glEnableVertexAttribArray( handle + 1 );
GLES20.glVertexAttribPointer( handle + 1, 4, GLES20.GL_FLOAT, false, 92, 28+16 );

GLES20.glEnableVertexAttribArray( handle + 2 );
GLES20.glVertexAttribPointer( handle + 2, 4, GLES20.GL_FLOAT, false, 92, 28+32 );

GLES20.glEnableVertexAttribArray( handle + 3 );
GLES20.glVertexAttribPointer( handle + 3, 4, GLES20.GL_FLOAT, false, 92, 28+48 );

请注意它如何需要 4 个顶点属性指针?顶点属性“vertexTransformation”实际上占据了 handlehandle+3 的位置。

关于android - 使用矩阵作为顶点着色器属性时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27091599/

相关文章:

android - 复制岛只有一组图像,为什么?

opengl-es - 无法让 OpenGL 代码正常工作

ios - 使用glVertexAttribPointer在带有着色器的OpenGL 2.0中绘制模型

php - Android 上的 HTTP POST 到 PHP 抛出 NullPointer 错误

Android Activity 和 Fragment,最佳实践

iphone - 我可以在不手动转换所有顶点的情况下进行 openGL 几何批处理吗?

opengl - OpenGL 在流水线中乘以哪些矩阵?

java - SharedPreference ClassCastException 问题 Android

android - SQLite异常: no such column: _id: for ContentProvider

iphone - 在 iOS 上加载压缩图像的最快方法是什么?