【发布时间】: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)
}
【问题讨论】: