在我实施之前,我想知道是否可能:
我想使用实例渲染和多个颜色附件。对于每个实例或几何,我想将颜色数据写入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吗?
答案 0 :(得分:0)
我们可以对彩色附件进行有条件的写作吗?
不是你的意思。
如果glDrawBuffers
状态表示片段输出将被路由到颜色缓冲区,那么将始终将其路由到它。如果您没有写入该值,则写入附件的值将是未定义的。
因此,虽然您可以更改您编写的值,但您无法选择将 nothing 写入附件。该选择基于glDrawBuffers
州。
看起来非常像你想要的layered rendering。
我们可以将gl_Instance_ID的值赋给着色器内的任何变量吗?
......是的。你为什么不这么想?它只是实现填充的输入值。
我们可以在片段着色器中使用gl_Instance_ID吗?
没有。它仅存在于顶点着色器中。如果您需要任何其他着色器阶段来访问它,那么您的VS需要将值传递给它。
答案 1 :(得分:0)
片段着色器中的代码可以使用。您可以决定哪种颜色附件输出得到什么。
Nicol所说的是你不能不生成输出。片段着色器将始终输出Color0和Color1(Color2,3,...)。如果你没有分配一个值,那么输出将是垃圾,但会写一些东西。
因此,当实例ID与颜色附件不匹配时,您应该有一个默认值,并将其分配给不匹配的输出。
希望这有帮助。