天空盒不显示纹理

huangapple go评论92阅读模式
英文:

Skybox does not show textures

问题

我的天空盒被显示出来了,但是加载的纹理并没有显示出来,而是显示为黑色。

我正在使用具有多重采样帧缓冲支持的渲染器(链接:https://github.com/LWJGL/lwjgl3-demos/blob/master/src/org/lwjgl/demo/opengl/fbo/MultisampledFbo2Demo.java)。

我的纹理加载代码如下:

  1. private int loadSkyboxTextures(){
  2. int texID = glGenTextures();
  3. glBindTexture(GL_TEXTURE_CUBE_MAP, texID);
  4. for(int i = 0; i < TEXTURE_FILES.length; i++){
  5. InputStream file = getClass().getResourceAsStream(TEXTURE_FILES[i]);
  6. byte[] pixelData = new byte[0];
  7. try {
  8. pixelData = new byte[file.available()];
  9. file.read(pixelData);
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. ByteBuffer byteBuffer = ByteBuffer.wrap(pixelData);
  14. glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 512, 512, 0,
  15. GL_RGB, GL_UNSIGNED_BYTE, byteBuffer);
  16. }
  17. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  18. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  19. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  20. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  21. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
  22. return texID;
  23. }

立方体渲染代码:

  1. private void drawSkybox(){
  2. glEnable(GL_TEXTURE_CUBE_MAP);
  3. glDepthMask(false);
  4. glGenBuffers(vbo);
  5. glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
  6. glBufferData(GL_ARRAY_BUFFER, POINTS, GL_STATIC_DRAW);
  7. glGenVertexArrays(vao);
  8. glBindVertexArray(vao[0]);
  9. glVertexAttribPointer(0, 3, GL_FLOAT, false, 3 * Float.BYTES, NULL);
  10. glEnableVertexAttribArray(0);
  11. glActiveTexture(GL_TEXTURE0);
  12. glBindTexture(GL_TEXTURE_CUBE_MAP, texId);
  13. glDrawArrays(GL_TRIANGLES, 0, 36);
  14. glDisableVertexAttribArray(0);
  15. glBindVertexArray(0);
  16. glDepthMask(true);
  17. glBindBuffer (GL_ARRAY_BUFFER,0);
  18. glDisable(GL_TEXTURE_CUBE_MAP);
  19. }

在主渲染函数中的立方体渲染调用:

  1. glMatrixMode(GL_PROJECTION);
  2. glOrtho(-max, max, -1, 1, 10, -10);
  3. glRotated(cameraX, 1f, 0f, 0);
  4. glRotated(cameraY, 0f, 1f, 0);
  5. glGetFloatv(GL_PROJECTION_MATRIX, pm);
  6. glMatrixMode(GL_MODELVIEW);
  7. glLoadIdentity();
  8. drawSkybox();
  9. glLoadIdentity();
  10. ...
  11. // 渲染其他物体
英文:

My skybox is displayed, but does not display the textures that I load from the image. Instead, it shows the black color.

I am using a render with MultisampledFbo support.

My texture loading code looks like this:

  1. private int loadSkyboxTextures(){
  2. int texID = glGenTextures();
  3. glBindTexture(GL_TEXTURE_CUBE_MAP, texID);
  4. for(int i = 0; i &lt; TEXTURE_FILES.length; i++){
  5. InputStream file = getClass().getResourceAsStream(TEXTURE_FILES[i]);
  6. byte[] pixelData = new byte[0];
  7. try {
  8. pixelData = new byte[file.available()];
  9. file.read(pixelData);
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. ByteBuffer byteBuffer = ByteBuffer.wrap(pixelData);
  14. glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 512, 512, 0,
  15. GL_RGB, GL_UNSIGNED_BYTE, byteBuffer);
  16. }
  17. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  18. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  19. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  20. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  21. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
  22. return texID;
  23. }

Cube Render Code:

  1. private void drawSkybox(){
  2. glEnable(GL_TEXTURE_CUBE_MAP);
  3. glDepthMask(false);
  4. glGenBuffers(vbo);
  5. glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
  6. glBufferData(GL_ARRAY_BUFFER, POINTS, GL_STATIC_DRAW);
  7. glGenVertexArrays(vao);
  8. glBindVertexArray(vao[0]);
  9. glVertexAttribPointer(0, 3, GL_FLOAT, false, 3 * Float.BYTES, NULL);
  10. glEnableVertexAttribArray(0);
  11. glActiveTexture(GL_TEXTURE0);
  12. glBindTexture(GL_TEXTURE_CUBE_MAP, texId);
  13. glDrawArrays(GL_TRIANGLES, 0, 36);
  14. glDisableVertexAttribArray(0);
  15. glBindVertexArray(0);
  16. glDepthMask(true);
  17. glBindBuffer (GL_ARRAY_BUFFER,0);
  18. glDisable(GL_TEXTURE_CUBE_MAP);
  19. }

The cube rendering call in the main render function:

  1. glMatrixMode(GL_PROJECTION);
  2. glOrtho(-max, max, -1, 1, 10, -10);
  3. glRotated(cameraX, 1f, 0f, 0);
  4. glRotated(cameraY, 0f, 1f, 0);
  5. glGetFloatv(GL_PROJECTION_MATRIX, pm);
  6. glMatrixMode(GL_MODELVIEW);
  7. glLoadIdentity();
  8. drawSkybox();
  9. glLoadIdentity();
  10. ...
  11. //render other objects

答案1

得分: 1

Legacy OpenGL的纹理映射必须被启用。为了执行立方体映射纹理,必须启用GL_TEXTURE_CUBE_MAP(参见glEnable):

  1. glEnable(GL_TEXTURE_CUBE_MAP);

注意,对于立方体贴图纹理,纹理坐标是三维的,并被视为从立方体贴图中心开始的向量。

英文:

Legacy OpenGL's texturing has to be enabled. To perform cube-mapped texturing, GL_TEXTURE_CUBE_MAP has to be enabled (see glEnable):

  1. glEnable(GL_TEXTURE_CUBE_MAP);

Note, for cube map textures, the texture coordinates are 3-dimensional and treated as a vector form the center of the cube map.

huangapple
  • 本文由 发表于 2020年4月9日 04:50:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/61109787.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定