具有多个颜色附件的实例渲染

时间:2016-06-13 18:40:32

标签: opengl

在我实施之前,我想知道是否可能:

我想使用实例渲染和多个颜色附件。对于每个实例或几何,我想将颜色数据写入FBO的不同颜色附件。根据我的gl_instance值,我想写入特定的颜色附件。换句话说,我的第一个实例应该转到第一个颜色附件,第二个实例应该进入第二个附件,所以我的VS将是:

SELECT 
  fleet.company_name,
  MAX(CASE WHEN phone_type.name = 'Telephone' THEN phone_number.phone_number END) AS telephone,
  MAX(CASE WHEN phone_type.name = 'Toll Free' THEN phone_number.phone_number END) AS toll_free,
  MAX(CASE WHEN phone_type.name = 'Fax' THEN phone_number.phone_number END) AS fax
FROM 
  fleetseek.phone_number, 
  fleetseek.phone_type, 
  fleetseek.fleet, 
  fleetseek.fleet_phone
WHERE 
  phone_number.phone_type_id = phone_type.phone_type_id AND
  fleet.fleet_id = fleet_phone.fleet_id AND
  fleet_phone.phone_number_id = phone_number.phone_number_id
GROUP BY
  fleet.company_name;

FS

in vec4 position;
uniform mat4 u_mvp0;
uniform mat4 u_mvp1;
flat out instance_id;
main(){
     mat4 mvp;
     if(gl_Instance_ID == 0)
          mvp = u_mvp1;
     if(gl_Instance_ID == 1)
          mvp = u_mvp0;

     gl_Position = mvp * position;
     instance_id = gl_Instance_ID;
}

我们可以对彩色附件进行有条件的写作吗?我们可以将gl_Instance_ID的值赋给着色器内的任何变量吗?或者我们可以在片段着色器中使用gl_Instance_ID吗?

2 个答案:

答案 0 :(得分:0)

  

我们可以对彩色附件进行有条件的写作吗?

不是你的意思。

如果glDrawBuffers状态表示片段输出将被路由到颜色缓冲区,那么将始终将其路由到它。如果您没有写入该值,则写入附件的值将是未定义的。

因此,虽然您可以更改您编写的值,但您无法选择将 nothing 写入附件。该选择基于glDrawBuffers州。

看起来非常像你想要的layered rendering

  

我们可以将gl_Instance_ID的值赋给着色器内的任何变量吗?

......是的。你为什么不这么想?它只是实现填充的输入值。

  

我们可以在片段着色器中使用gl_Instance_ID吗?

没有。它仅存在于顶点着色器中。如果您需要任何其他着色器阶段来访问它,那么您的VS需要将值传递给它。

答案 1 :(得分:0)

温文尔雅,我认为你对Nicol Bolas有点误解。我会试着改写他的回答。

片段着色器中的代码可以使用。您可以决定哪种颜色附件输出得到什么。

Nicol所说的是你不能生成输出。片段着色器将始终输出Color0和Color1(Color2,3,...)。如果你没有分配一个值,那么输出将是垃圾,但会写一些东西。

因此,当实例ID与颜色附件不匹配时,您应该有一个默认值,并将其分配给不匹配的输出。

希望这有帮助。