【发布时间】:2022-01-27 08:25:58
【问题描述】:
我正在尝试通过顶点着色器 (OpenGL ES) 在 GPU 中创建具有粒子运动的 2D 粒子系统。我的问题是,无论我尝试什么,我都无法移动屏幕上的顶点。它们在指定坐标处呈现为白点,但不会移动偏移量或我在着色器中计算的任何内容。我将代码大量简化为这个基本示例,它也不起作用。
我假设我在某个地方对 API 或一般概念做出了错误的假设,但在哪里?
我的顶点着色器(particle.vert):
attribute vec2 a_position;
attribute vec4 a_color;
varying vec4 v_color;
uniform vec2 offset;
uniform mat4 u_projTrans;
void main() {
v_color = a_color;
// Offset does not have any effect
gl_Position = u_projTrans * vec4(a_position + offset, 0.0, 1.0)
}
片段着色器(particle.frag):
#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_color;
void main() {
gl_FragColor = v_color;
}
我的胶水代码是用LibGdx (Java) 完成的:
package com.foobarfoofoobar.game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.VertexAttribute;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.ScreenUtils;
public class GameScreen implements Screen {
private final Mesh mesh;
private final ShaderProgram shader;
private final OrthographicCamera camera;
public GameScreen() {
mesh = new Mesh(
true,
3,
3,
new VertexAttribute(Usage.Position, 2, ShaderProgram.POSITION_ATTRIBUTE),
VertexAttribute.ColorUnpacked());
mesh.setVertices(new float[]{
100f, 100f, 1, 1, 1, 1,
150f, 150f, 1, 1, 1, 1,
200f, 100f, 1, 1, 1, 1
});
mesh.setIndices(new short[]{ 0, 1, 2 });
ShaderProgram.pedantic = false;
shader = new ShaderProgram(
Gdx.files.internal("particle.vert").readString(),
Gdx.files.internal("particle.frag").readString());
if (!shader.isCompiled()) {
Gdx.app.log("Problem loading shader:", shader.getLog());
System.exit(1);
}
Vector2 displayDimensions = new Vector2(
Gdx.graphics.getWidth(),
Gdx.graphics.getHeight());
Vector2 displayCenter = displayDimensions.cpy().scl(0.5f);
camera = new OrthographicCamera(
Gdx.graphics.getWidth(),
Gdx.graphics.getHeight());
camera.translate(displayCenter);
camera.update();
}
@Override
public void render(float delta) {
ScreenUtils.clear(0f, 0f, 0f, 1);
shader.bind();
shader.setUniformMatrix("u_projTrans", camera.combined);
shader.setUniform2fv("u_offset", new float[]{ 200, 0 }, 0, 2);
mesh.render(shader, GL20.GL_POINTS);
}
@Override
public void show() {
}
@Override
public void dispose() {
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
}
【问题讨论】:
标签: opengl-es libgdx fragment-shader vertex-shader particle-system