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);
}
我已經通過了教程,閱讀有關的錯誤,我不能找出一步,我已經錯過了。
新的位:int loc = glGet ....現在拋出相同的錯誤,它好像是一個鏈接錯誤。 – Atrus 2012-02-23 01:26:26
@Atrus鏈接錯誤通過glGetProgramInfoLog報告,您是否檢查着色器編譯和鏈接是否成功? – 2012-02-23 01:36:45
我已經使用GL20.glGetProgramInfoLog(着色器,4096)。它什麼都不打印。我嘗試把它放在不同的區域之後(具體在glAttachShader,glLinkProgram和glValidateProgram之後)。沒什麼。 – Atrus 2012-02-23 19:12:25