opengl JOGL向片段着色器传递对象值

zfciruhq  于 2024-01-07  发布在  其他
关注(0)|答案(1)|浏览(206)

在我的OpenGL应用程序中,我试图将一个整数传递给顶点着色器,然后将其转发给片段着色器作为纹理数组中的zIndex。然而,当我使用VBO传递值时,整数值似乎总是为零。
我使用VBO来传递顶点,法线和纹理坐标,它们都按预期工作。唯一没有传递的值似乎是整数值。我也尝试用浮点数来做这件事,遇到了同样的行为。
顶点着色器

  1. #version 410
  2. layout (location = 0) in vec3 aPos;
  3. layout (location = 1) in vec3 aNorm;
  4. layout (location = 2) in vec2 aTexCoords;
  5. layout (location = 3) in uint aDepth;
  6. out vec2 TexCoords;
  7. out vec3 Normal;
  8. out vec3 FragPos;
  9. out uint vDepth;
  10. uniform mat4 model;
  11. uniform mat4 view;
  12. uniform mat4 projection;
  13. void main()
  14. {
  15. vDepth = aDepth;
  16. TexCoords = aTexCoords;
  17. gl_Position = projection * view * model * vec4(aPos, 1.0);
  18. }

字符串
片段着色器

  1. #version 410
  2. in vec2 TexCoords;
  3. flat in uint vDepth;
  4. uniform sampler2DArray textureArray;
  5. out vec4 FragColor;
  6. void main()
  7. {
  8. if(vDepth == 0) {
  9. FragColor = vec4(1.0, 0.0, 0.0, 1.0);
  10. } else {
  11. FragColor = vec4(0.0, 1.0, 0.0, 1.0);
  12. }
  13. // FragColor = texture(textureArray, vec3(TexCoords, vDepth));
  14. }


VAO /虚拟BO创建

  1. public Block(GL4 gl, int shaderProgram, float[] vertices, float[] normals, float[] textureCoordinates, int blockType) {
  2. gl.glUseProgram(shaderProgram);
  3. // setup object
  4. gl.glGenVertexArrays(1, vao, 0);
  5. gl.glGenBuffers(vbo.length, vbo, 0);
  6. // bind to vao
  7. gl.glBindVertexArray(vao[0]);
  8. gl.glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
  9. gl.glBufferData(GL_ARRAY_BUFFER, (long) vertices.length * Float.BYTES, Buffers.newDirectFloatBuffer(vertices), GL_STATIC_DRAW);
  10. gl.glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
  11. gl.glBufferData(GL_ARRAY_BUFFER, (long) normals.length * Float.BYTES, Buffers.newDirectFloatBuffer(normals), GL_STATIC_DRAW);
  12. gl.glBindBuffer(GL_ARRAY_BUFFER, vbo[2]);
  13. gl.glBufferData(GL_ARRAY_BUFFER, (long) textureCoordinates.length * Float.BYTES, Buffers.newDirectFloatBuffer(textureCoordinates), GL_STATIC_DRAW);
  14. // ISSUE IS HERE //
  15. gl.glBindBuffer(GL_ARRAY_BUFFER, vbo[3]);
  16. IntBuffer blockBuffer = Buffers.newDirectIntBuffer(blockType);
  17. gl.glBufferData(GL_ARRAY_BUFFER, Integer.BYTES, blockBuffer, GL_STATIC_DRAW);
  18. // bind to indices
  19. gl.glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
  20. gl.glVertexAttribPointer(0, 3, GL_FLOAT, false, 3 * Float.BYTES, 0);
  21. gl.glEnableVertexAttribArray(0);
  22. gl.glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
  23. gl.glVertexAttribPointer(1, 3, GL_FLOAT, false, 3 * Float.BYTES, 0);
  24. gl.glEnableVertexAttribArray(1);
  25. gl.glBindBuffer(GL_ARRAY_BUFFER, vbo[2]);
  26. gl.glVertexAttribPointer(2, 2, GL_FLOAT, false, 2 * Float.BYTES, 0);
  27. gl.glEnableVertexAttribArray(2);
  28. // ISSUE IS HERE //
  29. gl.glBindBuffer(GL_ARRAY_BUFFER, vbo[3]);
  30. gl.glVertexAttribIPointer(3, 1, GL_UNSIGNED_INT, Integer.BYTES, 0);
  31. gl.glEnableVertexAttribArray(3);
  32. gl.glBindBuffer(GL_ARRAY_BUFFER, 0);
  33. }

gfttwv5a

gfttwv5a1#

glBufferData的第二个参数是缓冲区的大小:
gl.glBufferData(GL_ARRAY_BUFFER, Integer.BYTES, blockBuffer, GL_STATIC_DRAW);

  1. gl.glBufferData(GL_ARRAY_BUFFER, Integer.BYTES * blockBuffer.limit(), blockBuffer, GL_STATIC_DRAW);

字符串
请注意,顶点着色器输入是一个属性,因此缓冲区必须为每个顶点提供一个值。

相关问题