爲什麼我們必須根據相機的視角來調整不同方向的紋理?它不應該是相同的(如果我啓用了深度測試)使用2D紋理在OpenGL中進行體繪製
編輯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:
但是當我的相機移動到z = 0附近時,部分紋理無法看到。 我試圖關閉深度測試,然後看到背面的紋理。爲什麼前面的紋理消失了?
- 啓用深度測試
- 殘疾人背面剔除
- 啓用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));
}
雖然它看起來並不吸引人,它的工作如預期。對於每一幀,我根據相機的位置對切片進行了排序。
編輯4:
我的阿爾法測試代碼
glEnable (GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1);
這兩條線是在init()函數。
是的它應該與啓用深度測試相同,但我猜他們正在做一些沒有深度測試的背對背混合。 – dari
我只是自己試了一下。看起來即使進行深度測試也是必要的。 – FunnyFunkyBuggy
您是否嘗試過使用深度去角質? Martin Pernollet給了我們一個基於JOGL的例子,他在Jzy3D中使用了這個算法。 – gouessej