我有一个framebuffer对象,我在其中使用N个纹理上的多目标渲染.在某个时候,我想清除其中一些纹理的内容,但不是全部.如果我打电话
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)
绑定到FBO的每个纹理都将被清除(我是对的吗?).有没有办法在特定的绘制缓冲区/纹理上执行此操作?
当我用glEnable设置东西,或者为我启用的东西指定func,然后切换帧缓冲区对象时,我的设置是为每个帧缓冲区对象保留的,还是我必须为每个缓冲区对象设置它们?在实践中,这有效吗?
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
for int i=0; i<N; i++{
glBindFramebuffer(GL_FRAMEBUFFER, fbos[i]);
rendering something to the fbos here
}
Run Code Online (Sandbox Code Playgroud)
或者我必须写
for int i=0; i<N; i++{
glBindFramebuffer(GL_FRAMEBUFFER, fbos[i]);
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
rendering something to the fbos here
}
Run Code Online (Sandbox Code Playgroud)
编辑:那glUseProgram呢?那是保留的吗?
我正在编写一个glsl片段着色器,其中我使用阴影贴图.按照本教程http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/,我写了这一行来评估shaodw偏见以避免阴影痤疮
float bias = 0.005 * tan( acos ( N_L_dot ) );
Run Code Online (Sandbox Code Playgroud)
但我从数学上知道
tan ( acos ( x ) = sqrt ( 1 - x^2 ) / x
Run Code Online (Sandbox Code Playgroud)
使用这种身份而不是棕褐色和acos会更快吗?在实践中,要使用这行代码
float bias = 0.005 * sqrt ( 1.f - N_L_dot * N_L_dot ) / N_L_dot ;
Run Code Online (Sandbox Code Playgroud)
我认为我的问题类似于"在执行sqrt和划分或tan和acos时,gpu更快吗?" ......或者我错过了什么?
所述#if预处理指令评估已知的预处理器"的常数"的表达.是否有类似的东西可以评估模板参数的表达式?
在实践中,我有这样的事情:
template<int i>
class Elem{ /*...*/};
#ifndef NUM_ELEM
#define NUM_ELEM 2
#endif
class MyClass
{
#if NUM_ELEM >= 1
Elem<1> e_1;
#endif
#if NUM_ELEM >= 2
Elem<2> e_2;
#endif
#if NUM_ELEM >= 3
Elem<3> e_3;
#endif
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
但我真的想让MyClass成为一个模板:
template<int num_elem>
MyClass{
#if num_elem >= 1 //but #if can't understand num_elem
Elem<1> e_1;
#endif
#if num_elem >= 2
Elem<2> e_2;
#endif
#if num_elem >= 3
Elem<3> e_3;
#endif
/*...*/
};
Run Code Online (Sandbox Code Playgroud) 可以将相同的纹理绑定到多个帧缓冲对象吗?我需要在具有特定fbo的多目标渲染过程中写入一些纹理,然后稍后为这些纹理中的一个添加一些混合,所以我需要第二个带有该纹理的帧缓冲对象.