繁体   English   中英

glDrawArraysInstanced无法正常工作

[英]glDrawArraysInstanced not working properly

我是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代码

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

是在调用“ glVertexAttribPointer(fulltransform,...)”中从glGetAttribLocation()返回的“ fulltransform”,在绘制之前我没有看到您调用“ glEnableVertexAttribArray(fulltransform + 0/1/2/3)”。

glVertexAttribPointer()调用中的步幅值看起来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));

跨步(第二个参数也是最后一个参数)是属性的后续值之间的字节差。 由于您的属性是矩阵行,并且整个矩阵包含16个浮点值,因此,例如,一个矩阵的第一行(这是您的第一个属性)与下一个矩阵的第一行之间的差是16个浮点值。 因此,这些调用应为:

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

作为健全性检查,如果您有交错的属性,则最后一个属性偏移量的总和与该属性的大小通常应加在一起用于所有属性的步幅值。 或者,作为类似的测试,所有属性大小的总和应相加。 修改后的步幅值就是这种情况,但对于您的原始代码而言并非如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM