1

首先,我给出了在 opengl 中有问题的渲染图像的屏幕截图。第四个表面图像是由 Matlab 绘制的,这就是图像在 Opengl 中的样子。

这里的问题

.

另一个角度

.

...

.

数据集的matlab渲染: MATLAB 渲染

(前3张是OpenGL在不同角度绘制的有问题的锯齿状图,第4张是正确的MATLAB绘制的图像)

图像是一个 1024 x 1024 的复矩阵。每个元素的虚部是点的高度(在 1024x1024 高度图中),实部是点的颜色。

在 matlab 中,我们创建了一个小的高斯形状的山。在 OpenGL 中,它是用破布和锯齿呈现的。“衣衫褴褛”遍布整个图像。

此外,根据对象的视角,似乎存在一条线以外的区域,不仅会出现更奇怪的锯齿版本,而且渲染的图形也会产生高度跳跃/变化。

什么会导致这种情况?为什么会发生这种“衣衫褴褛”,那条线是什么?我们现在已经用完了所有的想法,并且会感谢任何帮助。下面给出了 VBO 代码的相关部分。我们基本上为一个顶点创建了一个 float4 对象。结构中的第一、第二和第三个浮点数对应点的坐标。第 4 个浮点数(视为 4 个单字节数字)是 RGBA 颜色。

另请注意,包含高度图和颜色信息的复杂矩阵存储在 GPU 中,因此代码中有对 CUDA 的调用。当所有数据都转储到一个文件中时,matlab成功绘制了地图,所以数据肯定是正确的。

#define BUFFER_OFFSET(i) ((char *)NULL + (i))

void initGL()
{
...
  glViewport(0, 0, window_width, window_height);
    glEnable(GL_BLEND);
glEnable(GL_COLOR_MATERIAL);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)window_width / (GLfloat) window_height, 0.1, 15.0);
...
}


void display()
{
camx += camx_v;
camy += camy_v;
camx_v=0;
camy_v=0;


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// set view matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();


gluLookAt(0, 0, 1, /* look from camera XYZ */
           0, 0, 0, /* look at the origin */
           0, 1, 0); /* positive Y up vector */

drawGround();

glTranslatef(camx, camy, translate_z);

glRotatef(rotate_x, 1.0, 0.0, 0.0);
glRotatef(rotate_y, 0.0, 1.0, 0.0);


glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 16, BUFFER_OFFSET(0));
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 16, BUFFER_OFFSET(12));

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_i);
glDrawElements(GL_TRIANGLES, (mesh_width-1) * (mesh_height-1) * 6, GL_UNSIGNED_INT, (GLvoid*)0);


glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);



glutSwapBuffers();

 }

 void createVBO(GLuint* vbo, struct cudaGraphicsResource **vbo_res, 
       unsigned int vbo_res_flags)
{

glGenBuffers(1, vbo);
glBindBuffer(GL_ARRAY_BUFFER, *vbo);

unsigned int size = mesh_width * mesh_height * 4 * sizeof(float);
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, 0);

cutilSafeCall(cudaGraphicsGLRegisterBuffer(vbo_res, *vbo, vbo_res_flags));


 }


  void createIBO(GLuint* vbo, struct cudaGraphicsResource **vbo_res, 
       unsigned int vbo_res_flags, unsigned int numofindice)
  {

glGenBuffers(1, vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *vbo);


unsigned int size = (mesh_width-1) * (mesh_height-1) * numofindice * sizeof(GLuint);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, 0, GL_STATIC_DRAW);


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
cutilSafeCall(cudaGraphicsGLRegisterBuffer(vbo_res, *vbo, vbo_res_flags));

}

  void main()
 {
 initGL();
createVBO(&vbo, &cuda_vbo_resource, cudaGraphicsMapFlagsWriteDiscard);
    createIBO(&vbo_i, &cuda_vbo_resource_i, cudaGraphicsMapFlagsWriteDiscard, 6);
   glutMainLoop();
  }

//内核填充GPU中的INDEX BUFFER,在程序初始化时调用一次。

  __global__ void fillIBO(unsigned int* pos_i, unsigned int M)
 {
   unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;

unsigned int bi;

if(y<M-1 && x<M-1)
{


    bi =  ((M-1)*y +x)*6;

    //TRI
    pos_i[bi++] = x + y*M + 1;
    pos_i[bi++] = x + y*M + M + 1;
    pos_i[bi++] = x + y*M;

    pos_i[bi++] = x + y*M; 
    pos_i[bi++] = x + y*M + M + 1;
    pos_i[bi++] = x + y*M + M; 

}    
  }
4

1 回答 1

1

将第二个三角形替换为:

pos_i[bi++] = x + y*M + 1;
pos_i[bi++] = x + y*M + M + 1;
pos_i[bi++] = x + y*M + M;

另外,我很确定应该是

bi =  (M*y +x)*6;
于 2012-08-23T12:52:59.267 回答