【问题标题】:Vertex shader won't move vertex顶点着色器不会移动顶点
【发布时间】: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


    【解决方案1】:

    发现问题:

    我声明了制服u_offset,但将其用作offset。将顶点着色器中的制服重命名为offset 后,它可以工作了。

    这是在着色器的日志中报告的,但它没有打印出来,因为它确实编译了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2019-02-17
      相关资源
      最近更新 更多