2013-07-23 6 views
0

Я нарисовал круг в квадрате на OpenGL ES 2.0. Код в шейдере фрагмента принимает центр и радиус, который был установлен, и создает круг в квадрате. Это работало нормально, пока я не попытался изменить цвет фона, поскольку квадрат все еще отображается пустым и не заполняется цветом фона/текстурой. Есть ли простой способ сделать квадровое заполнение с тем же цветом/текстурой, что и фон, в то же время сохраняя круг в шоу?OpenGL ES 2.0, quad не меняет цвет при изменении фона

Код в пиксельный шейдер выглядит следующим образом:

"varying highp vec2 textureCoordinate;\n" 

"const highp vec2 center = vec2(0.5, 0.5);\n" 
"const highp float radius = 0.5;\n" 

"void main()\n" 
"{\n" 
"highp float distanceFromCenter = distance(center, textureCoordinate);\n" 
"lowp float checkForPresenceWithinCircle = step(distanceFromCenter, radius);\n" 

"gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * checkForPresenceWithinCircle;\n" 
"}\n" 

ответ

1

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

Ваш фрагментарный шейдер всегда выводит значение - даже если оно вне круга. То есть, если checkForPresenceWithinCircle равно 0.0, gl_FragColor получает назначенный vec4 (0.0, 0.0, 0.0, 0.0) - прозрачный черный.

Я думаю, что вы ищете discard ключевое слово, которое мешает шейдеру выводить что-либо для этого фрагмента. Что-то вроде:

if (checkForPresenceWithinCircle > 0.0) 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
else 
    discard; 

Поскольку вы знаете, что альфа будет 0.0 вне круга и 1.0 в пределах, можно также добиться того же эффекта с помощью альфа-смешивание с API стороны:

draw_background(); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
draw_circle(); 
glDisable(GL_BLEND); 
+0

проблемы Thankyou решена! –

0

альфа часть gl_FragColor обычно читается из текстуры, как это:

vec4 vTexture = texture2D(gsuTexture0, gsvTexCoord); 
gl_FragColor = vTexture; 

Кроме того, убедитесь, что ваш цвет буфера clear имеет значение альфа, равное 0,0, например:

glClearColor(fRed, fGreen, fBlue, 0.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

И есть также пр. oblem, что вы не можете использовать альфа текстуры с классом Android Bitmap, как описано здесь:

http://software.intel.com/en-us/articles/porting-opengl-games-to-android-on-intel-atom-processors-part-1/

Смежные вопросы