#java #opengl #shader #jogl #texture-mapping
#java #opengl #шейдер #jogl #текстурное отображение
Вопрос:
Я рисую квадрат с отображением текстуры с текстурой, на которой есть несколько прозрачных пикселей. Итак, я загружаю текстуру, а затем рисую ее
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:
gl_Color
это цвет, выводимый вершинным шейдером. Если ваш вершинный шейдер не выполнил за вас выборку текстуры, то ваш вершинный шейдер, вероятно, передает атрибут 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);
}
Вам также нужно будет установить значение программы uniform в текстурную единицу, которую вы используете. Однако вам придется поискать это.