Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 实现使用统一采样器2D(lwjgl)的片段着色器_Opengl_Lwjgl_Fragment Shader - Fatal编程技术网

Opengl 实现使用统一采样器2D(lwjgl)的片段着色器

Opengl 实现使用统一采样器2D(lwjgl)的片段着色器,opengl,lwjgl,fragment-shader,Opengl,Lwjgl,Fragment Shader,我无法成功运行着色器,而且我似乎错过了使其正常工作的一些步骤。我最后的错误是: 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 sprit

我无法成功运行着色器,而且我似乎错过了使其正常工作的一些步骤。我最后的错误是:

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着色器以前已在Sprites构造函数中使用以下命令初始化:

shader = GL20.glCreateProgram();
这是以前的问题,但不再明显。现在我看到了实际错误发生的地方,在sprite(本例中为两个)draw方法中,如下所示:

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);
}
我已经阅读了教程,阅读了有关错误的信息,但我不知道我错过了哪一步

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);

然后它应该可以工作。

新的位:int loc=glGet。。。。正在抛出相同的错误,似乎是链接错误。@Atrus链接错误通过glGetProgramInfoLog报告,是否检查着色器编译和链接是否成功?我使用了GL20.glGetProgramInfoLog(着色器,4096)。它什么也没印出来。我试着把它放在不同的区域之后(特别是在:glAttachShader、glLinkProgram和glValidateProgram之后)。什么都没有。