Java OpenGL применяет фрагментный шейдер к частично прозрачному текстурному четырехугольнику - PullRequest
2 голосов
/ 11 июня 2011

Я рисую четырехугольник с текстурой, на котором есть прозрачные пиксели.Итак, я загружаю текстуру и затем рисую ее

    gl.glEnable(GL.GL_ALPHA_TEST);
    gl.glAlphaFunc(GL.GL_GREATER,0);
    gl.glBindTexture(GL.GL_TEXTURE_2D, texture);
    gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, buff);
    gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
    gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
    gl.glColor4i(1,1,1,1);
    gl.glBegin(GL.GL_QUADS);
    // draw my quad here
    gl.glEnd():

Когда я рисую это, прозрачные пиксели не отображаются должным образом.Однако я хочу применить фрагментный шейдер.В этом случае я протестирую что-то простое:

void main() {
  gl_FragColor = vec4(0.0);
  if ( gl_Color.a > 0.0 ) { 
    gl_FragColor = vec4(1.0,0,0,1.0); 
  }
}

В этом случае ВСЕ пиксели должны быть красного цвета, а не только непрозрачные.Может кто-нибудь объяснить, как просто закрасить непрозрачные пиксели с помощью шейдера?

спасибо, Джефф

1 Ответ

2 голосов
/ 11 июня 2011

gl_Color - вывод цвета вершинным шейдером. Если ваш вершинный шейдер не сделал выборку текстур для вас, то ваш вершинный шейдер, вероятно, передает атрибут цвета непосредственно вашему фрагментному шейдеру через gl_FrontColor.

Если вы не используете вершинный шейдер, а просто используете обработку вершин с фиксированной функцией, то наверняка фрагментный шейдер получил только цвет. Помните, что фрагментные шейдеры переопределяют все операции glTexEnv для каждого фрагмента, включая выборку текстуры.

Если вы хотите проверить непрозрачность текстуры , то вам нужно выбрать текстуру самостоятельно. Это требует использования объекта sampler2D и функции texture2D (при условии, что вы используете GLSL версии 1.20. Если вы используете более поздние версии, вам нужна функция texture). Уже давно я ничего не делал со встроенными входами и выходами OpenGL, но шейдер выглядел примерно так:

#version 120
uniform sampler2D myTexture;

void main()
{
    gl_FragColor = vec4(0.0);
    vec4 texColor = texture2D(myTexture, gl_TexCoord[0]); //Assuming you're using texture coordinate 0.
    if(texColor.a < 1.0)
        gl_FragColor = vec4(1.0,0,0,1.0);
}

Вам также нужно будет установить значение униформы программы в единицу текстуры, которую вы используете. Вам придется поискать его, хотя.

...