Glsl 在使多个对象共享着色器的同时绘制多个对象

Glsl 在使多个对象共享着色器的同时绘制多个对象,glsl,webgl,webgl2,Glsl,Webgl,Webgl2,有两个绘制对象组,我想合并成一个画布,一个雨效果层和形成一个圆圈的点。这些是它们的顶点着色器代码,取自 两个着色器都为gl_位置和gl_点大小指定不同的值。我想不出一种方法可以将它们合并到一个顶点着色器下而不产生冲突。顶点数据集完全在着色器内部现场生成,而不是从缓冲区传递,这一点没有帮助。向着色器添加一个统一变量,指示要使用的算法 #版本300 es 统一整数; 均匀浮动时间; 统一整数模式;//0或1 //散列函数 // [...] void main(){ 浮点u=浮点(gl_VertexI

有两个绘制对象组,我想合并成一个画布,一个雨效果层和形成一个圆圈的点。这些是它们的顶点着色器代码,取自


两个着色器都为gl_位置和gl_点大小指定不同的值。我想不出一种方法可以将它们合并到一个顶点着色器下而不产生冲突。顶点数据集完全在着色器内部现场生成,而不是从缓冲区传递,这一点没有帮助。

向着色器添加一个统一变量,指示要使用的算法

#版本300 es
统一整数;
均匀浮动时间;
统一整数模式;//0或1
//散列函数
// [...]
void main(){
浮点u=浮点(gl_VertexID)/float(numVerts);//从0变为1
vec2位置;
浮点大小;
如果(模式==0){
float off=floor(time+u)/1000.0;//每个顶点每秒更改一次
浮点x=散列(u+off)*2.0-1.0;//随机位置
浮动y=fract(时间+u)*-2.0+1.0;//1.0->-1.0
pos=vec2(x,y);
pointSize=2.0
}
否则{
浮动角度=u*PI*2.0;//从0变为2PI
浮动半径=0.8;
浮动纵横比=分辨率.y/分辨率.x;
vec2尺度=vec2(纵横比,1);
pos=vec2(cos(角度)、sin(角度))*半径*刻度;
pointSize=5.0;
}
gl_位置=vec4(位置0,1);
gl_PointSize=PointSize;
}

问题解决了吗?请阅读并考虑你发现最有用的东西。
// Rain effect
const vs = `#version 300 es
uniform int numVerts;
uniform float time;

// hash function from https://www.shadertoy.com/view/4djSRW
// given a value between 0 and 1
// returns a value between 0 and 1 that *appears* kind of random
float hash(float p) {
  vec2 p2 = fract(vec2(p * 5.3983, p * 5.4427));
  p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137));
  return fract(p2.x * p2.y * 95.4337);
}

void main() {
  float u = float(gl_VertexID) / float(numVerts);  // goes from 0 to 1
  float off = floor(time + u) / 1000.0;            // changes once per second per vertex
  float x = hash(u + off) * 2.0 - 1.0;             // random position
  float y = fract(time + u) * -2.0 + 1.0;          // 1.0 ->  -1.0

  gl_Position = vec4(x, y, 0, 1);
  gl_PointSize = 2.0;
}
`;
// Points forming a circle
const vs = `#version 300 es
uniform int numVerts;
uniform vec2 resolution;

#define PI radians(180.0)

void main() {
  float u = float(gl_VertexID) / float(numVerts);  // goes from 0 to 1
  float angle = u * PI * 2.0;                      // goes from 0 to 2PI
  float radius = 0.8;

  vec2 pos = vec2(cos(angle), sin(angle)) * radius;
  
  float aspect = resolution.y / resolution.x;
  vec2 scale = vec2(aspect, 1);
  
  gl_Position = vec4(pos * scale, 0, 1);
  gl_PointSize = 5.0;
}
`;