2017-06-05 359 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