2012-02-01 79 views
1

我一直在試圖弄清楚如何移植these tutorials的第2章。LWJGL代碼產生黑屏

該代碼只產生一個黑色的屏幕,我不明白爲什麼。沒有錯誤產生。

package modern.opengl; 

import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferByte; 
import java.io.File; 
import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.FloatBuffer; 
import java.nio.ShortBuffer; 
import java.util.logging.FileHandler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import org.lwjgl.LWJGLException; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.input.Mouse; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 
import static org.lwjgl.opengl.GL11.*; 
import static org.lwjgl.opengl.GL12.GL_BGR; 
import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; 
import static org.lwjgl.opengl.GL13.*; 
import static org.lwjgl.opengl.GL15.*; 
import static org.lwjgl.opengl.GL20.*; 
import org.lwjgl.util.Timer; 

public class Lesson01 { 

    public static final Logger logger = Logger.getLogger(Lesson01.class.getName()); 

    static { 
     try { 
      logger.addHandler(new FileHandler("errors.log", true)); 
     } catch (IOException ex) { 
      logger.log(Level.WARNING, ex.toString(), ex); 
     } 
    } 
    private int displayWidth; 
    private int displayHeight; 
    private String displayTitle; 
    private int vertexBuffer; 
    private int elementBuffer; 
    private int texture0; 
    private int texture1; 
    private int program; 
    private int uniformFadeFactor; 
    private int uniformTexture0; 
    private int uniformTexture1; 
    private int attributePosition; 
    private float fadeFactor; 
    private Timer timer; 

    public static void main(String[] args) { 
     Lesson01 lesson01 = null; 
     try { 
      lesson01 = new Lesson01(); 
      lesson01.setup(); 
      lesson01.run(); 
     } catch (Exception ex) { 
      logger.log(Level.SEVERE, ex.toString(), ex); 
     } finally { 
      if (lesson01 != null) { 
       lesson01.teardown(); 
      } 
     } 
    } 

    public Lesson01() { 
     timer = new Timer(); 
     timer.resume(); 
     displayWidth = 400; 
     displayHeight = 300; 
     displayTitle = "Lesson 01"; 
    } 

    public void makeResources() throws Exception { 
     float[] vertexBufferDataArray = {-1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f}; 
     FloatBuffer vertexBufferData = ByteBuffer.allocateDirect(vertexBufferDataArray.length * 4).asFloatBuffer(); 
     vertexBufferData.put(vertexBufferDataArray); 
     vertexBufferData.rewind(); 
     vertexBuffer = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
     glBufferData(GL_ARRAY_BUFFER, vertexBufferData, GL_STATIC_DRAW); 

     short[] elementBufferDataArray = {0, 1, 2, 3}; 
     ShortBuffer elementBufferData = ByteBuffer.allocateDirect(elementBufferDataArray.length * 2).asShortBuffer(); 
     elementBufferData.put(elementBufferDataArray); 
     elementBufferData.rewind(); 
     elementBuffer = glGenBuffers(); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer); 
     glBufferData(GL_ELEMENT_ARRAY_BUFFER, elementBufferData, GL_STATIC_DRAW); 

     texture0 = makeTexture("hello1.png"); 
     texture1 = makeTexture("hello2.png"); 
     if (texture0 == 0 || texture1 == 0) { 
      throw new Exception("Failed to allocate textures!"); 
     } 

     String vertexShaderSource = 
       "#version 110          \n" 
       + "attribute vec2 position;      \n" 
       + "varying vec2 texcoord;       \n" 
       + "void main()         \n" 
       + "{            \n" 
       + "gl_Position = vec4(position, 0.0, 1.0);  \n" 
       + "texcoord = position * vec2(0.5) + vec2(0.5); \n" 
       + "}            \n"; 
     int vertexShader = glCreateShader(GL_VERTEX_SHADER); 
     glShaderSource(vertexShader, vertexShaderSource); 
     glCompileShader(vertexShader); 
     if (glGetShader(vertexShader, GL_COMPILE_STATUS) == 0) { 
      logger.log(Level.SEVERE, glGetShaderInfoLog(vertexShader, 10240)); 
      throw new Exception("Failed to compile vertex shader!"); 
     } 

     String fragmentShaderSource = 
       "#version 110         \n" 
       + "uniform float fade_factor;     \n" 
       + "uniform sampler2D textures[2];    \n" 
       + "varying vec2 texcoord;      \n" 
       + "void main()        \n" 
       + "{           \n" 
       + " gl_FragColor = mix(     \n" 
       + "  texture2D(textures[0], texcoord), \n" 
       + "  texture2D(textures[1], texcoord), \n" 
       + "  fade_factor      \n" 
       + " );          \n" 
       + "}           \n"; 
     int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
     glShaderSource(fragmentShader, fragmentShaderSource); 
     glCompileShader(fragmentShader); 
     if (glGetShader(fragmentShader, GL_COMPILE_STATUS) == 0) { 
      logger.log(Level.SEVERE, glGetShaderInfoLog(fragmentShader, 10240)); 
      throw new Exception("Failed to compule vertex shader!"); 
     } 

     program = glCreateProgram(); 
     glAttachShader(program, vertexShader); 
     glAttachShader(program, fragmentShader); 
     glLinkProgram(program); 
     if (glGetProgram(program, GL_LINK_STATUS) == 0) { 
      logger.log(Level.SEVERE, glGetProgramInfoLog(program, 10240)); 
      throw new Exception("Failed to link shader program."); 
     } 

     uniformFadeFactor = glGetUniformLocation(program, "fade_factor"); 
     uniformTexture0 = glGetUniformLocation(program, "textures[0]"); 
     uniformTexture1 = glGetUniformLocation(program, "textures[1]"); 
     attributePosition = glGetAttribLocation(program, "position"); 
    } 

    public void setup() throws LWJGLException, Exception { 
     Display.setDisplayMode(new DisplayMode(displayWidth, displayHeight)); 
     Display.setFullscreen(false); 
     Display.setTitle(displayTitle); 
     Display.create(); 
     Keyboard.create(); 
     Mouse.create(); 
     makeResources(); 
    } 

    public void teardown() { 
     Mouse.destroy(); 
     Keyboard.destroy(); 
     Display.destroy(); 
    } 

    public void run() { 
     while (!Display.isCloseRequested()) { 
      Timer.tick(); 
      if (Display.isVisible()) { 
       fadeFactor = (float) (Math.sin(timer.getTime()) * 0.5 + 0.5); 
       render(); 
      } else { 
       if (Display.isDirty()) { 
        render(); 
       } 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException ex) { 
        // Pass 
       } 
      } 
      Display.update(); 
      Display.sync(60); 
     } 
    } 

    public void render() { 
     glUseProgram(program); 
     glUniform1f(uniformFadeFactor, fadeFactor); 

     glActiveTexture(GL_TEXTURE0); 
     glBindTexture(GL_TEXTURE_2D, texture0); 
     glUniform1i(uniformTexture0, 0); 

     glActiveTexture(GL_TEXTURE1); 
     glBindTexture(GL_TEXTURE_2D, texture1); 
     glUniform1i(uniformTexture1, 1); 

     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
     glVertexAttribPointer(attributePosition, 2, GL_FLOAT, false, 8, 0); 
     glEnableVertexAttribArray(attributePosition); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer); 
     glDrawElements(GL_TRIANGLE_STRIP, 4, GL_SHORT, 0); 
     glDisableVertexAttribArray(attributePosition); 
    } 

    public static int makeTexture(String filename) throws IOException { 
     BufferedImage bufferedImage = ImageIO.read(new File(filename)); 
     byte[] textureBufferArray = ((DataBufferByte) (bufferedImage.getRaster().getDataBuffer())).getData(); 
     ByteBuffer textureBuffer = ByteBuffer.allocateDirect(textureBufferArray.length); 
     textureBuffer.put(textureBufferArray); 
     textureBuffer.rewind(); 
     int textureId = glGenTextures(); 
     glBindTexture(GL_TEXTURE_2D, textureId); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
     glTexImage2D(
      GL_TEXTURE_2D, 
      0, 
      GL_RGB8, 
      bufferedImage.getWidth(), 
      bufferedImage.getHeight(), 
      0, 
      GL_BGR, 
      GL_UNSIGNED_BYTE, 
      textureBuffer 
     ); 
     return textureId; 
    } 
} 
+0

你試過更新你的顯卡驅動嗎? – jpalm 2012-02-01 02:01:37

+0

是的,我做到了。這些例子在C中工作。 – user635639 2012-02-03 22:51:35

回答