在学习 OpenGL 的过程中,我正在使用 Java/LWJGL,并且正在围绕 LWJGL 创建自己的轻型面向对象框架,但是我对如何使用 glVertexAttribPointer
感到非常困惑>.
采用我的以下代码:
public class GameController extends Controller {
//<editor-fold defaultstate="collapsed" desc="keep-imports">
static {
int KEEP_LWJGL_IMPORTS = GL_2_BYTES | GL_ALIASED_LINE_WIDTH_RANGE | GL_ACTIVE_TEXTURE | GL_BLEND_COLOR | GL_ARRAY_BUFFER | GL_ACTIVE_ATTRIBUTE_MAX_LENGTH | GL_COMPRESSED_SLUMINANCE | GL_ALPHA_INTEGER | GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH | GL_ALREADY_SIGNALED | GL_ANY_SAMPLES_PASSED | GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH | GL_ACTIVE_PROGRAM | GL_ACTIVE_ATOMIC_COUNTER_BUFFERS | GL_ACTIVE_RESOURCES | GL_BUFFER_IMMUTABLE_STORAGE;
int KEEP_OWN_IMPORTS = PROJECTION_MATRIX.getLocation();
}
//</editor-fold>
private Program testProgram;
private VertexArray vertexArray;
private ArrayBuffer arrayBuffer;
private final Matrix4f modelviewMatrix = new Matrix4f();
private final FloatBuffer modelViewMatrixBuffer = BufferUtils.createFloatBuffer(16);
private float aspect;
private Matrix4f projectionMatrix;
final float[] vertexPositions = new float[] {
-0.25f, 0.25f, -0.25f,
-0.25f, -0.25f, -0.25f,
0.25f, -0.25f, -0.25f,
0.25f, -0.25f, -0.25f,
0.25f, 0.25f, -0.25f,
-0.25f, 0.25f, -0.25f,
0.25f, -0.25f, -0.25f,
0.25f, -0.25f, 0.25f,
0.25f, 0.25f, -0.25f,
0.25f, -0.25f, 0.25f,
0.25f, 0.25f, 0.25f,
0.25f, 0.25f, -0.25f,
0.25f, -0.25f, 0.25f,
-0.25f, -0.25f, 0.25f,
0.25f, 0.25f, 0.25f,
-0.25f, -0.25f, 0.25f,
-0.25f, 0.25f, 0.25f,
0.25f, 0.25f, 0.25f,
-0.25f, -0.25f, 0.25f,
-0.25f, -0.25f, -0.25f,
-0.25f, 0.25f, 0.25f,
-0.25f, -0.25f, -0.25f,
-0.25f, 0.25f, -0.25f,
-0.25f, 0.25f, 0.25f,
-0.25f, -0.25f, 0.25f,
0.25f, -0.25f, 0.25f,
0.25f, -0.25f, -0.25f,
0.25f, -0.25f, -0.25f,
-0.25f, -0.25f, -0.25f,
-0.25f, -0.25f, 0.25f,
-0.25f, 0.25f, -0.25f,
0.25f, 0.25f, -0.25f,
0.25f, 0.25f, 0.25f,
0.25f, 0.25f, 0.25f,
-0.25f, 0.25f, 0.25f,
-0.25f, 0.25f, -0.25f
};
public GameController(final boolean debug) {
super(debug);
}
@Override
protected void init() {
glViewport(0, 0, 800, 600);
testProgram = new Program(
new VertexShader("shaders/test.vert.glsl").compile(),
new FragmentShader("shaders/test.frag.glsl").compile()
).compile();
testProgram.use();
vertexArray = new VertexArray().create().bind();
arrayBuffer = new StaticDrawArrayBuffer().create().fillData(vertexPositions);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(0);
aspect = 800f / 600f;
projectionMatrix = new Matrix4f().identity().perspective(50.0f, aspect, 0.1f, 1000.0f);
Uniforms.setUniformMatrix4(PROJECTION_MATRIX, false, projectionMatrix);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CW);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
}
@Override
protected void render(final double msDelta) {
glClearColor(0.0f, 0.25f, 0.0f, 1.0f);
glClearDepthf(1f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
testProgram.use();
for (int i = 0; i < 24000; i++) {
float fVar = i + currentTime / 1000f * 0.3f;
modelviewMatrix.identity()
.translate(0.0f, 0.0f, -8.0f) //translate
.rotate(currentTime / 1000f * 45.0f, 0.0f, 1.0f, 0.0f) //rotate around Y
.rotate(currentTime / 1000f * 21.0f, 1.0f, 0.0f, 0.0f) //rotate around X
.translate(
(float)Math.sin(2.1f * fVar) * 2.0f,
(float)Math.cos(1.7f * fVar) * 2.0f,
(float)Math.sin(1.3f * fVar) * (float)Math.cos(1.5f * fVar) * 2.0f
); //translate
Uniforms.setUniformMatrix4(MODELVIEW_MATRIX, false, modelviewMatrix.writeToFloatBuffer(modelViewMatrixBuffer));
testProgram.drawArrays(GL_TRIANGLES, 0, 36);
}
}
@Override
protected void shutdown() {
testProgram.delete();
vertexArray.delete();
arrayBuffer.delete();
}
@Override
protected void windowResized(final int width, final int height) {
aspect = width * 1.0f / height;
projectionMatrix = new Matrix4f().identity().perspective(50.0f, aspect, 0.1f, 1000.0f);
Uniforms.setUniformMatrix4(PROJECTION_MATRIX, false, projectionMatrix);
}
public static void main(String[] args) {
Controller controller = new GameController(false);
controller.start();
}
}
我希望有人能准确地解释我应该在面向对象模型中放置 glVertexAttribPointer
和 glEnableVertexAttribArray
,例如在 VertexArray
中,或者在 ArrayBuffer
中(Buffer
是父类(super class)),或者甚至在 Program
中?
我认为我对框架的所有底层调用都是不言自明的,否则请随意询问。
最佳答案
如果不看看这个语句是如何实现的,很难说:
arrayBuffer = new StaticDrawArrayBuffer().create().fillData(vertexPositions);
假设为了创建并填充您的 arrayBuffer
与 vertexPositions
,该函数的副作用为 glBindBuffer (GL_ARRAY_BUFFER, ...)
那么您可以调用glVertexAttribPointer (...)
有意义。
但是,我要明确指出,fillData (...)
已经说了副作用。正如您现在的代码所示,没有人会通过查看它知道该行代码实际上绑定(bind)了一个缓冲区对象。为了保持一致性,您甚至可以考虑添加 bind (...)
方法给你StaticDrawArrayBuffer
类并在 glVertexAttribPointer (...)
之前调用它.
至于哪个类应该包装您讨论的函数,这些都是按顶点数组对象存储的。因此将它们添加到 VertexArray
。您甚至可能想要修改 VertexAttribPointer
包装器接口(interface),以便它引用缓冲区对象,而不是像 GL API 那样使用选择器/锁存器机制。
关于java - OpenGL 在面向对象模型中将 glVertexAttribPointer 放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21205393/