【发布时间】:2017-06-05 13:32:14
【问题描述】:
为什么我们必须根据相机的视角来对齐不同方向的纹理?不应该一样吗?(如果我启用了深度测试)
编辑 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:
我将“if (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:
我的 alpha 测试代码
glEnable (GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1);
这两行在 init() 函数中。
【问题讨论】:
-
是的,它应该与启用深度测试相同,但我猜他们正在做某种没有深度测试的从后到前的混合。
-
我自己试了一下。似乎即使进行深度测试也是必要的。
-
你试过使用深度剥离吗? Martin Pernollet 给我们举了一个基于 JOGL 的例子,他在 Jzy3D 中使用了这个算法。
-
没有。有没有相关的链接或教程?
标签: opengl graphics rendering jogl volume-rendering