好的,下面是一个简单的OpenGL GLSL shader代码实现扩散波效果,可以设置波的宽度、颜色和扩散速度,不需要使用纹理。
vertex shader代码:
```
#version 330 core
layout (location = 0) in vec2 position;
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
}
```
fragment shader代码:
```
#version 330 core
uniform vec2 center;
uniform float time;
uniform float speed;
uniform float width;
uniform vec4 color;
out vec4 FragColor;
void main()
{
float distance = length(center - gl_FragCoord.xy);
float diff = abs(distance - time * speed);
float alpha = 1.0 - smoothstep(width, 0.0, diff);
FragColor = color * alpha;
}
```
在使用程序之前需要先编译和链接shader程序,并且设置uniform变量的值:
```
GLuint shaderProgram = glCreateProgram();
GLuint vertexShader = compileShader(vertexShaderSource, GL_VERTEX_SHADER);
GLuint fragmentShader = compileShader(fragmentShaderSource, GL_FRAGMENT_SHADER);
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
...
glUseProgram(shaderProgram);
glUniform2f(glGetUniformLocation(shaderProgram, "center"), x, y);
glUniform1f(glGetUniformLocation(shaderProgram, "time"), time);
glUniform1f(glGetUniformLocation(shaderProgram, "speed"), speed);
glUniform1f(glGetUniformLocation(shaderProgram, "width"), width);
glUniform4f(glGetUniformLocation(shaderProgram, "color"), red, green, blue, alpha);
```
其中,x和y是扩散波的中心位置,time是时间戳,speed是扩散速度,width是波的宽度,red、green、blue、alpha是波的颜色。
顶点数据可以使用两个三角形组成一个矩形,或者使用glRect()函数绘制一个矩形。
```
GLfloat vertices[] = {
-1.0f, -1.0f,
1.0f, -1.0f,
1.0f, 1.0f,
1.0f, 1.0f,
-1.0f, 1.0f,
-1.0f, -1.0f
};
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 6);
```
这样就可以在OpenGL中绘制出扩散波效果了。