【问题标题】:OpenGL particle-system, problem with projection matrixOpenGL粒子系统,投影矩阵问题
【发布时间】:2021-07-19 12:03:55
【问题描述】:

我正在尝试使用 Kotlin 和 Joml 在 Opengl 中实现粒子系统。按照教程的建议,我只需要为顶点着色器创建一个投影矩阵并使用 ortho() 进行透视分割。这是我的矩阵代码

    var projection = Matrix4f()
    projection.ortho(0.0f, 1280.0f, 0.0f, 720.0f, -1.0f, 1.0f)
    partShader.setMat4("projection", projection, false )

还有我的顶点着色器:

layout (location = 0) in vec4 vertex;

out vec2 TexCoords;
    
uniform mat4 projection;
uniform vec2 offset; //position vector    

void main() {

    float scale = 10.0f;
    TexCoords = vertex.zw;
    gl_Position = projection * vec4((vertex.xy * scale) + offset, 0.0, 1.0);

}

结果是四边形位于屏幕的左下角,现在它是一个正方形并且它的大小是正确的。在它位于屏幕中心之前,带有偏移矢量 (0,0) 并且位于左下角。此外,不可能再将其移动偏移矢量。我真的不明白为什么。这是我的初始化和渲染方法

class ParticleGenerator (var shader : ShaderProgram, var texture : Texture2D, var amount : Int) {

var particleList = mutableListOf<Particle>()
var lastUsedParticle = 0
var unusedParticles = 0
var firstUnusedParticle = 0

lateinit var partTex: Texture2D

private var vao = 0
private var vbo = 0
private var ibo = 0

private var indexcount = 0

init {

    var particle_quad : FloatArray = floatArrayOf(

            0.0f, 1.0f, 0.0f, 1.0f,
            1.0f, 0.0f, 1.0f, 0.0f,
            0.0f, 0.0f, 0.0f, 0.0f,

            0.0f, 1.0f, 0.0f, 1.0f,
            1.0f, 1.0f, 1.0f, 1.0f,
            1.0f, 0.0f, 1.0f, 0.0f

    )

    var index_quad = intArrayOf(
            0, 1, 2,
            2, 3, 0
    )

    indexcount = index_quad.size

    this.vao = ARBVertexArrayObject.glGenVertexArrays()
    ARBVertexArrayObject.glBindVertexArray(vao)

    this.vbo = GL15.glGenBuffers()
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo)
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, particle_quad, GL15.GL_STATIC_DRAW)

    this.ibo = GL15.glGenBuffers()
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ibo)
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, index_quad, GL15.GL_STATIC_DRAW)

    glEnableVertexAttribArray(0)
    glVertexAttribPointer(0, 4, GL_FLOAT, false, 16, 0)
    glBindVertexArray(0)

}

fun render() {

    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL11.GL_ONE)
    glBindVertexArray(vao)

    glDrawArrays(GL_TRIANGLE_STRIP, 0, indexcount)
    glDisable(GL_BLEND)
    glBindVertexArray(0)

}

【问题讨论】:

    标签: opengl particle-system


    【解决方案1】:

    此外,不能再将其移动偏移矢量。我真的不明白为什么。

    当然可以通过更改offset 来移动您的对象。您只需将其设置为 offset 现在以像素为单位(相对于假定的 1280x720 视口大小,这可能是也可能不是您的视口的确切像素大小)。因此,如果没有投影矩阵,偏移量 1 意味着移动视口宽度的一半(在 NDC 中为 2),而偏移量 1 现在意味着视口宽度的 1/1280

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 2015-04-11
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多