Opengl 几何体着色器GLSL的条件输出
我试图找出如何在几何体着色器中切换输出,特别是以下两种输出:Opengl 几何体着色器GLSL的条件输出,opengl,glsl,vbo,opengl-4,geometry-shader,Opengl,Glsl,Vbo,Opengl 4,Geometry Shader,我试图找出如何在几何体着色器中切换输出,特别是以下两种输出: layout(points, max_vertices = 1) out; // OUTPUT 1 layout(triangle_strip, max_vertices = 4) out; // OUTPUT 2 我正在对星团进行渲染,并使用几何体着色器中生成的精灵创建了一个包含100000多颗恒星的数据集。但是,只有当我们靠近目标恒星时,精灵的“光晕”才会出现 几何体着色器 #version 440 cons
layout(points, max_vertices = 1) out; // OUTPUT 1
layout(triangle_strip, max_vertices = 4) out; // OUTPUT 2
我正在对星团进行渲染,并使用几何体着色器中生成的精灵创建了一个包含100000多颗恒星的数据集。但是,只有当我们靠近目标恒星时,精灵的“光晕”才会出现
几何体着色器
#version 440
const vec2 corners[4] = {
vec2(0.0, 1.0),
vec2(0.0, 0.0),
vec2(1.0, 1.0),
vec2(1.0, 0.0)
};
layout(points) in;
layout(points, max_vertices = 1) out;
//layout(triangle_strip, max_vertices = 4) out;
uniform vec4 campos;
float spriteSize = 0.000005; // set here for now.
out vec2 texCoord;
void main(){
float distToPoint = 1; //(1.f/((length(gl_in[0].gl_Position - campos)) ));
if(distToPoint == 1){ // dumb condition just to illustrate my point
// EMIT QUAD
for(int i=0; i<4; ++i){
vec4 pos = gl_in[0].gl_Position;
pos.xy += spriteSize *(corners[i] - vec2(0.5));
gl_Position = pos;
texCoord = corners[i];
EmitVertex();
}
EndPrimitive();
}else{
// EMIT POINT
gl_Position = gl_in[0].gl_Position;
EmitVertex();
EndPrimitive();
}
}
void main(void){
... // First I do a bunch of depth computation, irrelevant to this question
gl_FragDepth = depth;
// Here I want to switch between these two outputs!
//diffuse = texture2D(texture1, texCoord); // OUTPUT 1
diffuse = vec4(Color, 1.0); // OUTPUT 2
}
我最近遇到了几何体着色器的流,但在我的实例中找不到一个合适的例子来说明如何做到这一点
如果需要发布更多代码,请告诉我。您无法切换几何体着色器中发出的基本体类型
ARB_transform_feedback3
允许您在变换反馈时设置多个输出流,但输出到VBO,唯一的输出模式是points。@ColonelThirtyTwo-那么我唯一的选择就是使用单独的着色器了?不过,肯定有比这更优雅的解决方案,对吗?^另外,是否可以只使用两个不同的几何体着色器并在运行时切换它们?怎么用?(顶点和片段着色器始终相同)是的,必须使用两个几何体着色器,并通过绘制调用指定哪个几何体指向哪个着色器,或者只是不在着色器中发射几何体。我想它可以让你在不同的程序中重用着色器对象,但我还没有用过。还请记住,可以将多个“文件”指定给glShaderSource
,这样就不必在着色器之间重复代码。