渲染到纹理的一部分

发布于 2024-10-03 17:14:31 字数 276 浏览 1 评论 0原文

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

Tiles

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

Since layered rendering with a geometry shader in OpenGL seems a bit dodgy on some drivers/hardware, I would like to substitute the functionality with my own solution. This by using a big texture as rendertarget, with for example a resolution of 300². Then simulating layered rendering by rendering to 100² chunks in the texture. With that resolution it would result in 9 tiles/layers as shown in the mockup below:

Tiles

The question is; how to this with OpenGL? Supposedly with help of a geometry shader that renders the scene to the different tiles in one pass.?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小瓶盖 2024-10-10 17:14:31

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

解决问题的基本方法:

  • 将顶点着色器留空,仅返回顶点不变
  • 在几何着色器中为每个三角形创建 8 个新实例(总共将有 9 个三角形)
  • 在每个三角形上运行一个将投影三角形的函数。根据您的屏幕截图,您将需要 9 个不同的视图矩阵发送到几何着色器。
  • 现在排列三角形,以便每个三角形渲染在图像的不同部分。请注意,投影后,坐标的范围为 [-1; 1]所以你需要将每个三角形的坐标除以3,然后将相应的三角形移动1/3的倍数。
  • 如果计算每个像素的 phong 着色,则需要将相机位置发送到每个顶点的片段着色器,因为片段着色器不知道屏幕被划分,并且您有 9 个不同的相机位置。
  • There is no simple way to do it. You can use geometry shader to hack it together but it will most probably be slow, as you have to perform a lot of geometry instancing and then use the geometry shader for vertex shading as well because vertex shader is out of the game.

    Basic approach to the problem:

  • Leave vertex shader empty and just return the vertices unchanged
  • In geometry shader create 8 new instances of every triangle (together you will have 9 triangles)
  • On each of the triangles run a function that will project the triangle. According to your screenshot, you will need 9 different view matrices to be sent to the geometry shader.
  • Now arrange the triangles so that each renders on a different part of the image. Note that after the projection, the coordinates are in the range [-1; 1] so you need to divide the coordinates of each triangle by 3 and then shift the corresponding triangles by multiplies of 1/3.
  • If you calculate phong shading per pixel, you will need to send the camera position to the fragment shader with each vertex because the fragment shader has no clue about the screen being divided and you have 9 different camera positions.
  • ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文