2016-06-21 67 views
0

我正在嘗試瞭解更多關於顯示和與圖形和GUI元素進行交互的信息。作爲其中的一部分,我一直在關注使用LWJGL和Slick-Util的塔防教程:https://www.youtube.com/watch?v=rfR09erJu7U&list=PLFUqwj4q1Zr8GHs6bO4d6gxMGUh_2pcNgLWJGL/Slick-Util - 僅在某些情況下繪製線顯示

我自己擴展了一些東西,我試圖繪製一些具有紋理形狀的基本無紋理形狀。我可以繪製二維線,但是,繪製特定紋理形狀後繪製時纔會出現,但在繪製其他紋理形狀後不會顯示。我想知道我不明白導致這種不同的行爲。

這裏是我的主類,LineTest.java:

package main; 

import static helpers.Artist.BeginSession; 
import static helpers.Artist.DrawQuadTex; 
import static helpers.Artist.QuickLoad; 
import static helpers.Artist.drawLine; 

import org.lwjgl.opengl.Display; 
import org.newdawn.slick.opengl.Texture; 

import helpers.Artist; 

public class LineTest { 

    public LineTest() { 
     BeginSession(); 
     Texture bg = QuickLoad("bg"); 
     //Texture bg = QuickLoad("exitbutton"); 

     while(!Display.isCloseRequested()) { 
      DrawQuadTex(bg,0,0,Artist.WIDTH,Artist.HEIGHT); 
      drawLine(0,0,800,800); 

      Display.update(); 
      Display.sync(60); 
     } 
     Display.destroy(); 
    } 

    public static void main(String[] args) { 
     new LineTest(); 
    } 
} 

我的助手類,Artist.java:

package helpers; 

import static org.lwjgl.opengl.GL11.GL_BLEND; 
import static org.lwjgl.opengl.GL11.GL_LINES; 
import static org.lwjgl.opengl.GL11.GL_MODELVIEW; 
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA; 
import static org.lwjgl.opengl.GL11.GL_PROJECTION; 
import static org.lwjgl.opengl.GL11.GL_QUADS; 
import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA; 
import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; 
import static org.lwjgl.opengl.GL11.glBegin; 
import static org.lwjgl.opengl.GL11.glBlendFunc; 
import static org.lwjgl.opengl.GL11.glClearColor; 
import static org.lwjgl.opengl.GL11.glClearDepth; 
import static org.lwjgl.opengl.GL11.glColor4f; 
import static org.lwjgl.opengl.GL11.glEnable; 
import static org.lwjgl.opengl.GL11.glEnd; 
import static org.lwjgl.opengl.GL11.glLoadIdentity; 
import static org.lwjgl.opengl.GL11.glMatrixMode; 
import static org.lwjgl.opengl.GL11.glOrtho; 
import static org.lwjgl.opengl.GL11.glTexCoord2f; 
import static org.lwjgl.opengl.GL11.glTranslatef; 
import static org.lwjgl.opengl.GL11.glVertex2f; 

import java.io.IOException; 
import java.io.InputStream; 

import org.lwjgl.LWJGLException; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 
import org.newdawn.slick.opengl.Texture; 
import org.newdawn.slick.opengl.TextureLoader; 
import org.newdawn.slick.util.ResourceLoader; 

public class Artist { 

    public static final int WIDTH = 640, HEIGHT = 480; 

    public static void BeginSession() { 
     Display.setTitle("Line Test"); 
     try { 
      Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT)); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
     } 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(0, WIDTH, HEIGHT, 0, 1, -1); 
     glMatrixMode(GL_MODELVIEW); 
     glEnable(GL_TEXTURE_2D); 
     glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     glClearDepth(1); 
     glEnable(GL_BLEND); 
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    } 

    public static void drawLine(int x1, int y1, int x2, int y2) { 
     glColor4f(0.0f, 1.0f, 0.2f, 1.0f); 
     glBegin(GL_LINES); 
     glVertex2f((float) x1, (float) y1); 
     glVertex2f((float) x2, (float) y2); 
     glEnd(); 
     glColor4f(1f,1f,1f,1f); 
    } 
    public static void DrawQuadTex(Texture tex, float x, float y, float width, float height) { 
     tex.bind(); 
     glTranslatef(x, y, 0); 
     glBegin(GL_QUADS); 
     glTexCoord2f(0, 0); 
     glVertex2f(0, 0); 
     glTexCoord2f(1, 0); 
     glVertex2f(width, 0); 
     glTexCoord2f(1, 1); 
     glVertex2f(width, height); 
     glTexCoord2f(0,1); 
     glVertex2f(0, height); 
     glEnd(); 
     glLoadIdentity(); 
    } 
    public static Texture LoadTexture(String path, String fileType) { 
     Texture tex = null; 
     InputStream in = ResourceLoader.getResourceAsStream(path); 
     try { 
      tex = TextureLoader.getTexture(fileType, in); 
      in.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return tex; 
    } 

    public static Texture QuickLoad(String name) { 
     Texture tex = null; 
     tex = LoadTexture(name + ".png", "PNG"); 
     return tex; 
    } 
} 

我的問題的重要組成部分,是主類中,右在這裏:

Texture bg = QuickLoad("bg"); 
//Texture bg = QuickLoad("exitbutton"); 

while(!Display.isCloseRequested()) { 
    DrawQuadTex(bg,0,0,Artist.WIDTH,Artist.HEIGHT); 
    drawLine(0,0,800,800); 

當我Texture bg是讓我的 'BG' 圖形(純黑色PNG文件)時, drawLine功能似乎並沒有真正畫出一條線。但是,如果我更改我的Texture bg以獲取我的'exitbutton'圖形(其中寫入了「Exit」的藍色方塊,仍是PNG文件),則drawLine函數確實會創建可見線。

這imgur專輯包含兩個輸出:Texture bg = QuickLoad("bg"); & Texture bg = QuickLoad("exitbutton");

http://imgur.com/a/OVOzD

如果有必要,我還可以上傳,我同時使用PNG文件,但我現在不能包括在超過2個鏈接我題。 bg.png是一款單色黑色64x64 PNG。 exitbutton.png是512x512。

只是想了解是什麼導致了這一點。謝謝!

回答

0

的問題是最有可能的,你能夠在BeginSession()方法紋理,然後把它啓用了整個渲染:

glEnable(GL_TEXTURE_2D); 

這意味着你的行會被紋理。現在,你可能會說:「但是...我沒有指定線條的紋理座標!」不要緊。 OpenGL中的立即模式渲染API是基於狀態的,所以最後指定的紋理座標都是使用的。既然你drawLine()之前調用DrawQuadTex(),最後的紋理座標在DrawQuadTex()規定將畫線,當你當前的紋理座標:

glTexCoord2f(0,1); 

因此,線的顏色會在位置的紋素(0,1)的使用爲該行指定的顏色調製的當前綁定紋理:

glColor4f(0.0f, 1.0f, 0.2f, 1.0f); 

如果兩種顏色相乘會導致黑色,例如因爲給定的紋理元素是黑色的,結果將是黑色背景上的黑色線條。這看起來很像沒有渲染任何東西。

最簡潔的解決方案是僅在繪製要紋理的圖元時啓用紋理,之後將其禁用。例如,在DrawQuadTex()方法:

public static void DrawQuadTex(Texture tex, float x, float y, float width, float height) { 
    tex.bind(); 
    glEnable(GL_TEXTURE_2D); 
    ... 
    glDisable(GL_TEXTURE_2D); 
} 

如何追查這些類型的問題,或者避免他們一些提示:

  1. 設置明確的顏色爲黑色以外的東西在開發過程中。然後你可以很容易地判斷你是在渲染黑色的幾何圖形,還是根本沒有。
  2. 使用基於着色器的渲染。固定功能流水線最初看起來更容易,但事實並非如此。使用着色器時,生成的顏色正是您實現的顏色,而不是基於一組固定狀態的值的一些魔術組合。
  3. 當你在它的時候,你可能也想避免使用即時模式渲染。雖然不是直接導致這個問題,但它與使用固定功能管道一樣過時。
+0

這個解釋很清楚爲什麼當非單黑色的PNG文件被用於緊接着的紋理時,線的顏色調製仍然會起作用 - 但是不能用單黑PNG文件運行。由於來自「exitbutton」PNG的紋理元素不是黑色的,因此與線條顏色結合時不會渲染。 你給了我更多的研究,以及對圖書館的更好的理解。 – PlaneShaper

相關問題