我正在尝试创建一个 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”实际上占据了 handle
到 handle+3
的位置。
关于android - 使用矩阵作为顶点着色器属性时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27091599/