我是opengl的新手
我正在创建两个立方体
当我使用 glDrawArraysInstanced 时。根据我的矩阵变换,我没有得到预期的结果
这是我使用不同数据的代码
float fovy=tanf(GLKMathDegreesToRadians(30));
float nearplane=0.1f;
float farplane=10.0f;
float aspectratio=self.view.frame.size.width/self.view.frame.size.height;
float height=fovy*nearplane;
float width=height*aspectratio;
GLKMatrix4 frustum=GLKMatrix4MakeFrustum(-width, +width, -height, height, nearplane, farplane);
GLKMatrix4 translate=GLKMatrix4Translate(frustum, 0, 0.9, -3);
GLKMatrix4 rotatey= GLKMatrix4Rotate(translate, GLKMathDegreesToRadians(54), 0, 1, 0);
GLKMatrix4 translate1=GLKMatrix4Translate(frustum, 0, -0.5, -3);
GLKMatrix4 rotatey1= GLKMatrix4Rotate(translate1, GLKMathDegreesToRadians(54), 1, 1, 0);
GLKMatrix4 matarray[]=
{
rotatey,rotatey1
};
glGenBuffers(1, &matbuffer);
glBindBuffer(GL_ARRAY_BUFFER, matbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(matarray), matarray, GL_STATIC_DRAW);
glVertexAttribPointer(fulltransform,4, GL_FLOAT, GL_FALSE,sizeof(float)*4, (GLvoid*)(sizeof(float)*0));
glVertexAttribPointer(fulltransform+1, 4, GL_FLOAT, GL_FALSE,sizeof(float)*4, (GLvoid*)(sizeof(float)*4));
glVertexAttribPointer(fulltransform+2, 4, GL_FLOAT, GL_FALSE,sizeof(float)*4, (GLvoid*)(sizeof(float)*8));
glVertexAttribPointer(fulltransform+3, 4, GL_FLOAT, GL_FALSE,sizeof(float)*4, (GLvoid*)(sizeof(float)*12));
glVertexAttribDivisor(fulltransform, 1);
glVertexAttribDivisor(fulltransform+1, 1);
glVertexAttribDivisor(fulltransform+2, 1);
glVertexAttribDivisor(fulltransform+3, 1);
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArraysInstanced(GL_TRIANGLES, 0, numvertex,2);
这是我的结果
http://i.stack.imgur.com/RWAWQ.png
如果我使用统一变量并使用 gldrawarray 两次,那么我会得到完美的结果。这是我的代码和结果
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
float fovy=tanf(GLKMathDegreesToRadians(30));
float nearplane=0.1f;
float farplane=10.0f;
float aspectratio=self.view.frame.size.width/self.view.frame.size.height;
float height=fovy*nearplane;
float width=height*aspectratio;
GLKMatrix4 frustum=GLKMatrix4MakeFrustum(-width, +width, -height, height, nearplane, farplane);
GLKMatrix4 translate=GLKMatrix4Translate(frustum, 0, 0.9, -3);
GLKMatrix4 rotatey= GLKMatrix4Rotate(translate, GLKMathDegreesToRadians(54), 0, 1, 0);
glUniformMatrix4fv(uniformmatrix, 1, GL_FALSE, rotatey.m);
glDrawArrays(GL_TRIANGLES, 0, numvertex);
GLKMatrix4 translatey=GLKMatrix4Translate(frustum, 0,-0.5, -3);
GLKMatrix4 rotatex= GLKMatrix4Rotate(translatey, GLKMathDegreesToRadians(54), 1, 0, 0);
glUniformMatrix4fv(uniformmatrix, 1, GL_FALSE, rotatex.m);
glDrawArrays(GL_TRIANGLES, 0, numvertex);
http://i.stack.imgur.com/XnB9W.png
这是我的 glsl 代码
#版本 300 es
in vec4 position;
in vec4 color;
in mat4 fulltransform;
uniform mat4 matrix;
out vec4 fragcolor;
void main()
{
// in mat4 fulltransform
fragcolor=color;
gl_Position=fulltransform*position;
// uniform mat4 matrix
fragcolor=color;
gl_Position=matrix*position;
}
我也想知道这两种方法中的哪一种在 fps 的情况下表现更好
所有帮助将不胜感激。
GLuint programhandle=glCreateProgram();
glAttachShader(programhandle, vertex);
glAttachShader(programhandle, fragment);
glLinkProgram(programhandle);
GLint status;
position=glGetAttribLocation(programhandle,"position");
color=glGetAttribLocation(programhandle, "color");
uniformmatrix=glGetUniformLocation(programhandle, "matrix");
fulltransform=glGetAttribLocation(programhandle, "fulltransform");
glEnableVertexAttribArray(position);
glEnableVertexAttribArray(color);
glEnableVertexAttribArray(fulltransform);
glEnableVertexAttribArray(fulltransform+1);
glEnableVertexAttribArray(fulltransform+2);
glEnableVertexAttribArray(fulltransform+3);
glGetProgramiv(programhandle , GL_LINK_STATUS, &status);
if (status==GL_FALSE)
{
NSLog(@"program");
}
glDeleteShader(vertex);
glDeleteShader(fragment);
glUseProgram(programhandle);