2015-08-13 2 views
-1

Я работаю на шкатулке прокрутки в minecraft.OpenGL 2D Stencil

enter image description here

Свиток коробка есть одна проблема, некоторые элементы управления будут оказывать вне коробки, поэтому я решил посмотреть, если это возможно, чтобы предотвратить это. Я нашел трафареты, но это не сработает, может, я сделал что-то не так?

GL11.glEnable(GL11.GL_BLEND); 
    GL11.glEnable(GL11.GL_STENCIL_TEST); 
    GL11.glEnable(GL11.GL_TEXTURE_2D); 
    GL11.glDisable(GL11.GL_DEPTH_TEST); 
    GL11.glClearStencil(0); 
    GL11.glClear(GL11.GL_STENCIL_BUFFER_BIT); 

    GL11.glStencilFunc(GL11.GL_ALWAYS, 1, 1); 
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE); 

и это линия рендеринга фон прокрутки окна:

Vector4d color = new Vector4d(140, 140, 140, 255); 
    RenderHelper2D.drawGradientRect(1, 1, this.width-1, this.height-1, color, color); 

http://i.imgur.com/Ycg7AKo.png (Это черный указано серый рисунок)

GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 
    GL11.glStencilFunc(GL11.GL_EQUAL, 1, 1); 
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); 

оказывать все цели внутри scroll- (кнопки). Который не должен отображаться вне коробки.

gui.drawForeground(renderer); 

и сбросить все,

GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 
    GL11.glColorMask(true, true, true, true); 
    GL11.glDisable(GL11.GL_STENCIL_TEST); 

ответ

0

Я думаю, что вы ищете glScissor

Это позволяет в основном назначить прямоугольное окно обрезки на экране, и все, что вы рисуете, ничто никогда не будет за пределами этого прямоугольника.

Не забудьте позвонить по телефону glEnable(GL_SCISSOR_TEST) и до glDisable(GL_SCISSOR_TEST) после того, как вы нарисуете свою прокрутку. Он не будет работать без разрешения, и он не остановится без отключения;)

Имейте в виду, что значения, предоставляемые glScissor, являются целыми числами для начала координат, а также шириной и высотой требуемого окна обрезки, происхождение определяется как нижний левый. Таким образом,

glEnable(GL_SCISSOR_TEST) 
glScissor(0,0,100,100) 
:: DRAW YOUR CONTROLS HERE :: 
glDisable(GL_SCISSOR_TEST) 

будет создавать окно обрезки 100x100 в левом нижнем углу экрана.

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

+0

Спасибо. Это работает, очень хороший и простой ответ. – CreativeMD

+1

Это не должен быть квадрат. Область ножниц представляет собой прямоугольник, где ширина и высота могут быть разными. –

+0

Упс, вы абсолютно правы Reto. Я имел в виду прямоугольник! –