我正在用 IOS 上的 GPU 做重线性代数,所以我正在尝试 openGL ES 3.0。我从Bartosz Ciechanowski 的玩具代码开始计算一些一般的大乘小矩阵乘法。我将大的分割成向量,并使用一组统一矩阵来表示较小的矩阵。我已经设法输入和输出顶点着色器,但由于它看起来总是空的,所以无法正确获取统一矩阵。这是我所做的:
在顶点着色器中,我只是复制了我在统一向量中发送的内容:
uniform vec3 transMat0;
uniform vec3 transMat1;
in vec2 InV0;
out vec2 OutV0;
void main(){
OutV0 = vec2(transMat0.x,transMat1.y);
// OutV0 = InV0+vec2(1.0,2.0); //this works
}
在 ObjC 代码中,我将缓冲区内容声明为全局变量:
static GLfloat mat0Data[] = {1000.0,100.0,10.0,1.0,0.1,0.01};//outside methods
static GLfloat mat1Data[] = {1000.0,100.0,10.0,1.0,0.1,0.01};//outside methods
在我编译着色器并生成程序句柄的地方,我附加了缓冲区:
GLuint mat0 = glGetUniformLocation(program, "transMat0");
GLuint mat1 = glGetUniformLocation(program, "transMat1");
glUniform3fv(mat0, 1, &(mat0Data[0]));
glUniform3fv(mat1, 1, &(mat1Data[0]));
输出缓冲区只是读取全 0。只是为了证明其他一切正常,当我使用注释行时,我可以在转换反馈中得到正确的结果
OutV0 = InV0+vec2(1.0,2.0); //this works
所以我不得不怀疑我错过了统一向量的一些东西。有什么建议么?