0

私はopenglの初心者です

2 つの立方体を作成しています

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 を 2 回使用すると、完璧な結果が得られます。ここに私のコードと結果があります

  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

これが私のgslコードです

#バージョン 300es

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の場合、これら2つの方法のどちらがより良いパフォーマンスを発揮するかを知りたい

すべての助けをいただければ幸いです。

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);
4

2 に答える 2

0

glVertexAttribPointer()あなたの通話のストライド値はオフに見えます:

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));

ストライド (2 番目の最後の引数) は、属性の後続の値の間のバイト単位の差です。属性はマトリックス行であり、マトリックス全体に 16 個の float 値が含まれているため、たとえば、あるマトリックスの最初の行 (最初の属性) と次のマトリックスの最初の行との差は 16 個の float 値です。したがって、これらの呼び出しは次のようになります。

glVertexAttribPointer(fulltransform,4, GL_FLOAT, GL_FALSE,
    sizeof(float)*16, (GLvoid*)(sizeof(float)*0));
glVertexAttribPointer(fulltransform+1, 4, GL_FLOAT, GL_FALSE,
    sizeof(float)*16, (GLvoid*)(sizeof(float)*4));
glVertexAttribPointer(fulltransform+2, 4, GL_FLOAT, GL_FALSE,
    sizeof(float)*16, (GLvoid*)(sizeof(float)*8));
glVertexAttribPointer(fulltransform+3, 4, GL_FLOAT, GL_FALSE,
    sizeof(float)*16, (GLvoid*)(sizeof(float)*12));

正常性チェックとして、インターリーブされた属性がある場合は、通常、最後の属性オフセットとその属性のサイズの合計が、すべての属性に使用するストライド値になります。または、同様のテストとして、すべての属性サイズの合計がストライドになるはずです。これは修正されたストライド値の場合ですが、元のコードには当てはまりません。

于 2015-11-20T05:02:42.300 に答える
0

"glVertexAttribPointer(fulltransform,...)" の呼び出しで glGetAttribLocation() から "fulltransform" が返されます。

于 2015-11-19T12:02:21.467 に答える