1

我正在用 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

所以我不得不怀疑我错过了统一向量的一些东西。有什么建议么?

4

1 回答 1

0

正如 Reto 在评论中指出的那样,我错过了电话

glUseProgram()

加上这个,我现在可以把一切都搞对了。

于 2015-12-17T09:34:39.387 回答