Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GLSL-如何强制渲染片段?_Opengl_Glsl_Shader_Pixel - Fatal编程技术网

Opengl GLSL-如何强制渲染片段?

Opengl GLSL-如何强制渲染片段?,opengl,glsl,shader,pixel,Opengl,Glsl,Shader,Pixel,有没有办法强制渲染特定片段。据我所知,片段着色器仅用于栅格化三角形内的像素。我需要做的是在视口的固定位置上画一个标记(比如一个红色像素)。我的意思是这样的: void main(void) { if(gl_FragCoord.x == vec2(300.5, 300.5)){ gl_FragColor = vec4(1.0,0.0,0.0,1.0); } else { gl_FragColor = getColorFromSampler(); } ,而碎片(300.5300.5)后面既

有没有办法强制渲染特定片段。据我所知,片段着色器仅用于栅格化三角形内的像素。我需要做的是在视口的固定位置上画一个标记(比如一个红色像素)。我的意思是这样的:

void main(void) {
if(gl_FragCoord.x == vec2(300.5, 300.5)){
    gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
else {
gl_FragColor = getColorFromSampler();
}

,而碎片(300.5300.5)后面既没有四边形也没有任何东西。我不想影响性能(没有虚假的背景和东西)。在这种情况下如何进行?

有什么反对只在其他东西上渲染一个点的说法吗

因此,只需在给定像素处渲染单个
GL_点
基本体即可。使用适当的正交投影直接在窗口空间中指定顶点位置,或者仅计算像素的剪辑空间位置并使用标识顶点变换。然后,您只需要一个简单的穿透片段着色器来编写您选择的颜色


虽然你说你想要“碎片后面什么都不要”,但我仍然认为红色标记下渲染的单个碎片不会伤害任何人,至少不会比你在碎片着色器中的分支对单个像素的伤害更大(而不是更少)(或者使用模具缓冲区的任何其他更精细的技术)。如果您有任何其他更严格的原因,说明除了标记之外,无法在该位置渲染任何其他内容,您可能需要进一步澄清您的问题。

这是愚蠢的模具缓冲区技巧101的应用程序。换句话说,清除为红色,在模具缓冲区中设置单个像素,并使模具测试失败。或者别的什么。。。大约有十几种相同的方法。在深度方面也可以做到同样的效果。你的着色器解决方案显然也能工作,但前提是你将其添加到每个片段着色器中。@Damon好吧,与其用“模具缓冲技巧”渲染整个图像并遮掩像素,为什么不只渲染一个红色像素?@ChristianRau:Hehehe,当然,这是显而易见的解决方案,但OP想要“片段后面没有四元组,也没有任何内容”,因此我假设明显的方式不适用:)我想知道
glBlitFrameBuffer
是否允许…@Damon”片段后面也没有内容“-哦,我明白了,这就是我错过的,对不起。这似乎仍然是一个不合理的要求,但需要解决,谢谢。我不确定这个解决方案是否会将Glu POINT actor渲染为一个像素,而“像素完美”在我的情况下是至关重要的。另一方面,将其与着色器解决方案相结合似乎是一种过分的做法。我正在尝试这两种解决方案(this和Damons-不幸的是,我对模具缓冲区不太熟悉)。@WitoldKsiążek当然会。这就要求你不要乱弄点的大小(让它保持为1),我想也要远离多重采样。然后它应该是完美的像素,因为大小为1的点始终渲染为单个像素。但您需要注意坐标并使用像素中心,如(x.5,y.5)(当使用正交投影时,允许您在像素空间中指定顶点坐标),因为整数坐标可能会导致舍入问题,并使您指向“切换”对于相邻的像素…@WitoldKsiążek…但以像素中心为坐标,一切都应该表现得很好,没有任何问题或误差。像素完美的OpenGL不能马上工作,但这不是不可能的,也不需要太多的黑魔法。@WitoldKsiążek好吧,Damon的解决方案也需要你画一个像素(使用点),因为这是修改模具缓冲区的唯一方法。他的解决方案为您带来的唯一好处是不渲染红色标记后面的片段,但在您的案例中,这似乎不值得付出努力。渲染任何东西都需要着色器(当然,除非您使用不推荐的固定函数管道,但在这种情况下,我的解决方案也不需要任何着色器,只需画一个简单的红点即可)。我使用了您的解决方案,效果很好。非常感谢你。