3

我正在学习尝试使用 Java 和 LWJGL 学习 GLSL,但我目前遇到了基本顶点着色器的问题。

顶点着色器:

#version 120

void main() {
    gl_Position = gl_Vertex * 0.5;
}

片段着色器:

#version 120

void main() {
    gl_FragColor = vec4(1.0, 0.4, 0.4, 1.0);
}

渲染代码:

public void draw() {
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glVertexPointer(3, GL_FLOAT, 0, 0L);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0);
    glDisableClientState(GL_VERTEX_ARRAY);
}

编译没有产生错误,片段着色器工作正常,为我绘制的简单三角形着色。唯一的问题是我没有看到按预期缩小的三角形(0.5 因子),它的顶点保持不变。我究竟做错了什么?

4

1 回答 1

2

问题是这gl_Vertex是一个 4 维向量。直接将它与标量相乘不会给您预期的缩放结果。OpenGL 在将齐次坐标转换gl_Position为笛卡尔屏幕坐标时,将 x,y,z 与 w 分量相除。0.5 / 0.5 = 1.0 所以结果是没有缩放。

gl_Position = gl_Vertex * 0.5;

这将 x、y、z 和 w 分量乘以 0.5。将代码更改为仅缩放 x、y 和 z。

gl_Position = vec4(gl_Vertex.xyz * 0.5, gl_Vertex.w);
于 2013-08-22T20:14:20.983 回答