【问题标题】:Why the 3D Texture based Volume Rendering has no 3D effects为什么基于 3D 纹理的体积渲染没有 3D 效果
【发布时间】:2019-04-28 13:21:01
【问题描述】:

我使用OpenTK 实现了基于 3D 纹理的体积渲染。该代码基于此project。但结果显示没有 3D 效果,只有平面 2D 图像。

管道很简单:(1)加载3D纹理; (2) 绘制一系列四边形(矩形)并指定对应的纹理坐标。

每个四边形的顶点是使用生成的

private void generateVertices(int n)
    {
        vertices = new float[n * 3 * 4];
        int cur;
        for (int i = 0; i < n; i++)
        {
            cur = 3 * 4 * i;

            vertices[cur] = -.5f;
            vertices[cur + 1] = -.5f;
            vertices[cur + 2] = -0.5f + i / n;

            vertices[cur+3] = -.5f;
            vertices[cur + 4] = .5f;
            vertices[cur + 5] = -0.5f +  i / n;

            vertices[cur+6] = .5f;
            vertices[cur + 7] = .5f;
            vertices[cur + 8] = -0.5f +  i / n;

            vertices[cur+9] = .5f;
            vertices[cur + 10] = -.5f;
            vertices[cur + 11] = -0.5f + i / n;
        }
    }

要绘制 256 个四边形,只需调用 generateVertices(256) 和 opengl 例程

GLDrawElements(GL_QUADS,...)

TexCoordinates 是使用顶点着色器中的顶点位置计算的,如下所示:

texCoord = aPosition+vec3(0.5f,0.5f,0.5f);

欢迎提出任何想法。

【问题讨论】:

  • 我投票结束了这个问题,因为它缺少一个最小、完整和可验证的示例,并且因为(对我而言)完全不清楚 OP 的问题是什么。通过查看生成一些顶点的函数,任何人应该如何知道他们应该期望看到什么?此外,codeproject 文章依赖于过时的 OpenGL 管道。

标签: c# opentk


【解决方案1】:

整数 i 在 [0,n-1] 范围内,i/n 将永远为 0。 所以你确实指定了 n 个重叠的四边形。

解决方案很简单,只需将 i 显式转换为 float (float)i/n

【讨论】:

  • 如果n == 0,那么它永远不会进入循环。如果n &gt; 0,那么它确实进入了循环,并且i 增加到nn-1 是最后一次执行主体)。您从哪里断言 "i/n 将永远为 0"?这没有任何意义。
  • 知道了!通过进行以下更改,我在屏幕上渲染了一个 3D 体积:在 for 循环中:{ vertices[cur + 2] = -0.5f +1.0f* i / n;顶点[cur + 8] = -0.5f + 1.0fi / n;顶点[cur + 11] = -0.5f +1.0f i / n; }
  • @code_dredd 整数 1 / 整数 2 产生另一个整数 0。vertices[cur + 2] = -0.5f + i / n 永远等于 -0.5f。有 n 个具有相同位置的矩形添加到 VBO=> 没有 3d 效果。
  • @ShannonChow 我认为将那一点信息(即基于int的截断)添加到答案中并告诉OP将i和/或n转换为float,而不是“只乘以1.0f”(它的作用相同,但不那么明确),会改善答案。我不确定 OP 是否一定会从您的帖子中理解 为什么 这是一个问题...
猜你喜欢
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多