2012-02-22 58 views
2

我無法成功運行着色器,而且我似乎錯過了一些步驟來使其全部工作。我最終的錯誤:實現使用統一的Sampler2D的片段着色器(lwjgl)

Exception in thread "main" org.lwjgl.opengl.OpenGLException: Invalid operation (1282) 
    at org.lwjgl.opengl.Util.checkGLError(Util.java:59) 
    at org.lwjgl.opengl.GL20.glUniform1i(GL20.java:374) 
    at sprites.Sprite.draw(Sprite.java:256) 
    at gui.Game.drawFrame(Game.java:238) 
    at gui.Game.gameLoop(Game.java:205) 
    at gui.Game.startGame(Game.java:244) 
    at tests.simple.SimpleShader.main(SimpleShader.java:36) 

我的初始化開始:

int frag = FilterLoader.createShader("/tests/resources/shaders/grayscale.frag", GL20.GL_FRAGMENT_SHADER); 

和createShader方法如下所示:

int shader = GL20.glCreateShader(type); 

if(shader == 0) 
    return 0; 

StringBuilder code = new StringBuilder(""); 
String line; 

try 
{ 
    String path = FilterLoader.class.getResource(filename).getPath(); 
    BufferedReader reader = new BufferedReader(new FileReader(path)); 

    while((line = reader.readLine()) != null) 
    { 
     code.append(line + "\n"); 
    } 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
    System.err.println("Error reading in " + type + " shader"); 
    return 0; 
} 

GL20.glShaderSource(shader, code); 
GL20.glCompileShader(shader); 

return shader; 

我那麼着色器連接到特定的雪碧與:

two.addFragmentShader(frag); //two is a Sprite 

這只是簡單地說:

fragmentShader = fragment_shader; 
GL20.glAttachShader(shader, fragment_shader); 
GL20.glLinkProgram(shader); 

的int 着色器先前已初始化的精靈構造函數:

shader = GL20.glCreateProgram(); 

這是以前的問題,但已不再明顯。現在,我得到實際的錯誤發生在哪裏,在小精靈(兩人在這種情況下)繪製方法,它看起來像這樣:

if(true) 
{ 
    GL20.glUseProgram(shader); 
} 

glPushMatrix(); 

glActiveTexture(GL13.GL_TEXTURE0); 
imageData.getTexture().bind(); 

//The line below is where the error occurs. 
GL20.glUniform1i(fragmentShader, GL13.GL_TEXTURE0); 

int tx = (int)location.x; 
int ty = (int)location.y; 
glTranslatef(tx, ty, location.layer); 


float texture_X = ((float)which_column/(float)columns); 
float texture_Y = ((float)which_row/(float)rows); 
float texture_XplusWidth = ((float)(which_column+wide)/(float)columns); 
float texture_YplusHeight = ((float)(which_row+tall)/(float)rows); 

glBegin(GL_QUADS); 
{ 
    GL11.glTexCoord2f(texture_X, texture_Y); 
    glVertex2f(0, 0); 

    GL11.glTexCoord2f(texture_X, texture_YplusHeight); 
    glVertex2f(0, getHeight()); 

    GL11.glTexCoord2f(texture_XplusWidth, texture_YplusHeight); 
    glVertex2f(getWidth(), getHeight()); 

    GL11.glTexCoord2f(texture_XplusWidth, texture_Y); 
    glVertex2f(getWidth(), 0); 
} 
glEnd(); 
GL20.glUseProgram(0); 
glPopMatrix(); 

並且在該行發生錯誤:

GL20.glUniform1i(fragmentShader, GL13.GL_TEXTURE0); 

而且參考我的着色器:

// simple fragment shader 

uniform sampler2D texture; 

void main() 
{ 
    vec4 color, texel; 
    color = gl_Color; 
    texel = texture2DRect(texture, gl_TexCoord[0].xy); 
    color *= texel; 

    float gray = dot(color.rgb, vec3(0.299, 0.587, 0.144)); 

    gl_FragColor = vec4(gray, gray, gray, color.a); 
} 

我已經通過了教程,閱讀有關的錯誤,我不能找出一步,我已經錯過了。

回答

7
GL20.glUniform1i(fragmentShader, GL13.GL_TEXTURE0); 

這是錯誤的。 glUniform1i的第一個參數是統一的位置,您可以通過glGetUniformLocation獲得。

第二個參數是一個整數,但是對於紋理採樣,需要傳遞紋理單元數(0,1,2,等),並綁定紋理紋理單元,例如:

glUseProgram(program); 
int loc = glGetUniformLocation(program, "texture"); 
glUniform1i(loc, 0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texId); 

然後它應該工作。

+0

新的位:int loc = glGet ....現在拋出相同的錯誤,它好像是一個鏈接錯誤。 – Atrus 2012-02-23 01:26:26

+0

@Atrus鏈接錯誤通過glGetProgramInfoLog報告,您是否檢查着色器編譯和鏈接是否成功? – 2012-02-23 01:36:45

+0

我已經使用GL20.glGetProgramInfoLog(着色器,4096)。它什麼都不打印。我嘗試把它放在不同的區域之後(具體在glAttachShader,glLinkProgram和glValidateProgram之後)。沒什麼。 – Atrus 2012-02-23 19:12:25