2017-06-05 357 views
0

为什么我们必须根据相机的视角来调整不同方向的纹理?它不应该是相同的(如果我启用了深度测试)使用2D纹理在OpenGL中进行体绘制

First Slide Second Slide


编辑1:

我用我自己的程序进行测试。

这是我的渲染函数代码。

 if (position.z >= 0) pz = true; 
     else pz = false; 

     if (lz != pz) { 
      slice.clear(); 
      printf("Changed !!! :: %s", (pz?"Positive Z":"Negative Z")); 
      if (pz) { 
       for (float i = 0; i < count; ++i) { 
        slice.push_back(glm::vec2(-SIZE/2 + SIZE * i/(count-1), i)); 
       } 
       lz = pz; 
      } else { 
       for (float i = count-1; i >= 0; --i) { 
        slice.push_back(glm::vec2(-SIZE/2 + SIZE * i/(count-1), i)); 
       } 
       lz = pz; 
      } 
      glBindBuffer(GL_ARRAY_BUFFER, ibo); 
      glBufferData(GL_ARRAY_BUFFER, slice.size()* 2 *sizeof(float), &slice[0], GL_STATIC_DRAW); 
     } 

     glUseProgram(programID); 
     glBindVertexArray(vao); 
     glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]); 
     glActiveTexture(GL_TEXTURE0); 
     glBindTexture(GL_TEXTURE_2D, texture); 
     glEnableVertexAttribArray(0); 
     glEnableVertexAttribArray(1); 
     glEnableVertexAttribArray(2); 
     glDrawArraysInstanced(GL_TRIANGLES, 0, 6, slice.size()); 
     glDisableVertexAttribArray(0); 
     glDisableVertexAttribArray(1); 
     glDisableVertexAttribArray(2); 
     glBindVertexArray(0); 

载体 “切片” 含有2个漂浮(z位置和切片的ID)。它对每个实例都是独一无二的。如果没有这个“if(lz!= pz)...”子句,我只能在+ ve Z方向看到模型。


编辑2:

这是一个透视。 enter image description here

但是当我的相机移动到z = 0附近时,部分纹理无法看到。 我试图关闭深度测试,然后看到背面的纹理。为什么前面的纹理消失了? enter image description here

  1. 启用深度测试
  2. 残疾人背面剔除
  3. 启用alpha测试

编辑3:

我改变了“如果(LZ = pz)...“条款,下面的代码,现在一切正常。但我仍然不明白为什么。

 slice.clear(); 
     for (float i = 0; i < count; ++i) { // position is a vector representing the location of the camera 
      if (-SIZE/2 + SIZE * i/(count-1) >= position.z) break; 
      slice.push_back(glm::vec2(-SIZE/2 + SIZE * i/(count-1), i)); 
     } 

     for (float i = count-1; i >= 0; --i) { 
      if (-SIZE/2 + SIZE * i/(count-1) < position.z) break; 
      slice.push_back(glm::vec2(-SIZE/2 + SIZE * i/(count-1), i)); 
     } 

enter image description here 虽然它看起来并不吸引人,它的工作如预期。对于每一帧,我根据相机的位置对切片进行了排序。


编辑4:

我的阿尔法测试代码

glEnable (GL_ALPHA_TEST); 
glAlphaFunc(GL_GREATER, 0.1); 

这两条线是在init()函数。


+0

是的它应该与启用深度测试相同,但我猜他们正在做一些没有深度测试的背对背混合。 – dari

+0

我只是自己试了一下。看起来即使进行深度测试也是必要的。 – FunnyFunkyBuggy

+0

您是否尝试过使用深度去角质? Martin Pernollet给了我们一个基于JOGL的例子,他在Jzy3D中使用了这个算法。 – gouessej

回答

1

基本上我在这里看到了两个问题:

为什么选择最接近的轴相机的方向吗?

因为否则切片可能甚至不填卷的整个屏幕区域。假设您将切片平行于XY平面进行渲染,但照相机沿着X轴进行查看,即“从侧面”。然后你会看到切片之间的差距。就像这样:

Plates

为什么渲染后向前?

这并非总是必要的。原则上,如果启用alpha测试和深度测试,则可以按任意顺序进行渲染。但是,体积渲染通常假定支持部分透明的数据,在这种情况下,对于通常的阿尔法混合方程来处理几何图形必须重新渲染到前面。

+0

谢谢。第一个答案是非常丰富的。对于第二部分,我仍然得到奇怪的结果。我将在编辑帖子后发帖。我启用了深度测试和alpha测试。 – FunnyFunkyBuggy

+0

请参阅编辑2.我添加了我编译的程序 – FunnyFunkyBuggy

+0

@FunnyFunkyBuggy:它看起来像你没有做第一件事(即你不沿着主轴进行渲染)。除此之外,我觉得你已经启用了脸部剔除功能,这意味着远离相机的所有切片都不会被渲染。 – ybungalobill