【问题标题】:OpenGL lighting data for mesh - wastage网格的 OpenGL 光照数据 - 浪费
【发布时间】:2014-10-27 13:59:31
【问题描述】:

我正在开发一个类似于 Minecraft 的体素引擎,目前正在实现基本照明。

理想情况下,我只需要为每个块面(4 个顶点)存储一个光照值,光照值为 4 字节 (RGBA)。

目前,我为每个顶点存储 3 个浮点数

有没有办法只存储每个面的光照数据并将其发送到着色器,而不是每个顶点?

使用 4 字节整数的最佳方法是什么? (特别是如何发送到 GLSL 并与它一起使用)。我目前刚刚使用浮点数进行测试,但想停止这种内存浪费。

【问题讨论】:

  • “照明价值”是什么意思?正常吗?
  • @Raki 不,我的意思是我将脸部的原始颜色乘以产生照明效果的颜色。这种非常简单的光照不需要法线。

标签: c++ opengl glsl lighting


【解决方案1】:

您不需要为每个顶点创建颜色。相反,您可以使用统一变量,统一变量在绘制调用之间更改,例如,您可以在块的材质发生更改时更改值。

假设您有红色的块和蓝色的其他块。您可以像以下伪代码一样按材质进行单独的绘制调用:

for each blocks with the same material
Material->UseProgram();
SetUniform3f ( location, Material->Color ) // Change the color 
DrawBlocks();

您可以为每个块执行此操作,但建议尽可能减少状态更改(程序和制服)。

【讨论】:

  • 是的,但是相同材质的方块会有不同的光照值。而且我以 16x16 块的块来渲染这些块,而不是单独渲染。
  • @Brett 你所说的光值是什么意思?你不是在计算光值吗?光的贡献主要取决于使用点积的面部法线。
  • 光照是根据一个块暴露在阳光下等预先计算出来的,然后被赋予一个光照值。因此,每个块面都需要有一个独立的光照值,该光照值将应用于着色器。没有即时进行光照计算。
  • @Brett 此信息应该从一开始就添加到问题中。您可以将光照计算存储在压缩纹理中,并将值锁定在着色器中。
  • 作为统一体提供给着色器的光照值数组是否也可以工作?
猜你喜欢
  • 2020-03-20
  • 2021-12-25
  • 2019-11-05
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多