opengl - 渲染到纹理的一部分

标签 opengl 3d

由于 OpenGL 中使用几何着色器的分层渲染在某些驱动程序/硬件上似乎有点棘手,因此我想用我自己的解决方案替换该功能。这是通过使用大纹理作为渲染目标,例如分辨率为 300²。然后通过渲染纹理中的 100² block 来模拟分层渲染。使用该分辨率,将产生 9 个图 block /层,如下面的模型所示:

Tiles

问题是;如何使用 OpenGL 做到这一点?据说是在几何着色器的帮助下,一次性将场景渲染到不同的图 block 上。?

最佳答案

没有简单的方法可以做到这一点。您可以使用几何着色器将其组合在一起,但它很可能会很慢,因为您必须执行大量几何实例,然后还使用几何着色器进行顶点着色,因为顶点着色器已退出游戏。

解决问题的基本方法:

  • 将顶点着色器留空,仅返回顶点不变
  • 在几何着色器中,为每个三角形创建 8 个新实例(总共将有 9 个三角形)
  • 在每个三角形上运行一个函数来投影三角形。根据您的屏幕截图,您需要将 9 个不同的 View 矩阵发送到几何着色器。
  • 现在排列三角形,以便每个三角形都渲染在图像的不同部分。请注意,投影后,坐标的范围为 [-1; 1]所以你需要将每个三角形的坐标除以3,然后将相应的三角形平移1/3。
  • 如果计算每个像素的 phong 着色,则需要将相机位置发送到每个顶点的片段着色器,因为片段着色器不知道屏幕被划分,并且您有 9 个不同的相机位置。
  • 关于opengl - 渲染到纹理的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4234387/

    相关文章:

    macos - SDL2、Mac OS X 和 OpenGL : How to avoid including both gl. h 和 gl3.h?

    C++ OpenGL奇怪的正交相机

    python - 我尝试在游戏中设置白天循环,但是一旦变成夜晚,就不会再回到白天

    matlab - 如何在 matlab 中绘制多个 3d 立方体

    c++ - 编写 LookAt 函数

    c++ - OpenGl表面和纹理

    java - 更改 Java OpenGL 中的对象变量

    c++ - openGL视频显示

    c++ - OpenGL 中的相机旋转不使用 glRotatef gluLookAt

    python - openGL(pyglet) 3d 场景无法在 AMD 显卡上正确渲染