2016-11-04 3 views
-1

FIXED: нужен текущий результат glShadeModel(GL_SMOOTH);Rendering призраком радуги в Java OpenGL не смешивать цвета

: http://prntscr.com/d3ev6j

public static void drawBlendRectangle(double x, double y, double x1, double y1, int... colors) { 
    glPushMatrix(); 
    glDisable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glShadeModel(GL_SMOOTH); 
    glBegin(GL_QUADS); 

    double height = (y1 - y)/colors.length; 
    for (int i = 0; i < colors.length - 1; i++) {   
     float cTop[] = RenderUtils.getRGBA(colors[i]);  
     float cBottom[] = RenderUtils.getRGBA(colors[i + 1]);  
     glColor4f(cTop[0], cTop[1], cTop[2], cTop[3]); 
     glVertex2d(x, y + i * height); // top-left 
     glVertex2d(x1, y + i * height); // top-right 
     glColor4f(cBottom[0], cBottom[1], cBottom[2], cBottom[3]); 
     glVertex2d(x1, y + i * height + height); // bottom-right 
     glVertex2d(x, y + i * height + height); // bottom-left 
    } 
    glEnd(); 
    glDisable(GL_BLEND); 
    glEnable(GL_TEXTURE_2D); 
    glPopMatrix(); 
} 

У меня проблема с получением мой прямоугольник смешать все из цветов в фантастическом ключе, но не может заставить его работать Вот изображение: http://prntscr.com/d3767e

функция Я создал, я не очень хорошо знаком с OpenGL, так что я не знаю, если я пропускаю часть в процессе смешивания или я делаю это совершенно неправильно

public static void drawBlendRectangle(double x, double y, double x1, double y1, int... colors) { 
    glPushMatrix(); 
    glDisable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBegin(GL_QUADS); 
    for (int i = 0; i < colors.length; i++) { 
     float c[] = RenderUtils.getRGBA(colors[i]); 
     double height = (y1 - y)/colors.length; 

     glColor4d(c[0], c[1], c[2], 0.5f); 
     glVertex2d(x, y + i * height); // top-left 
     glVertex2d(x1, y + i * height); // top-right 
     glVertex2d(x1, y + i * height + height); // bottom-right 
     glVertex2d(x, y + i * height + height); // bottom-left 
    } 
    glEnd(); 
    glDisable(GL_BLEND); 
    glEnable(GL_TEXTURE_2D); 
    glPopMatrix(); 
} 

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

заранее спасибо

+0

ваши цвета смотрят неправильно, посмотрите на [значений RGB видимого спектра] (http://stackoverflow.com/a/22681410/2521214) – Spektre

ответ

0

Вам нужны разные цвета по углам четырехугольника.

double height = (y1 - y)/colors.length; 
for (int i = 0; i < colors.length - 1; i++) {   
    float cTop[] = RenderUtils.getRGBA(colors[i]);  
    float cBottom[] = RenderUtils.getRGBA(colors[i + 1]);  
    glColor4f(cTop[0], cTop[1], cTop[2], 0.5f); 
    glVertex2d(x, y + i * height); // top-left 
    glVertex2d(x1, y + i * height); // top-right 
    glColor4f(cBottom[0], cBottom[1], cBottom[2], 0.5f); 
    glVertex2d(x1, y + i * height + height); // bottom-right 
    glVertex2d(x, y + i * height + height); // bottom-left 
} 

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

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

glBegin(GL_TRIANGLE_STRIP); 
double height = (y1 - y)/colors.length; 
for (int i = 0; i < colors.length; i++) {   
    float c[] = RenderUtils.getRGBA(colors[i]);  
    glColor4f(c[0], c[1], c[2], 0.5f); 
    glVertex2d(x, y + i * height); // left 
    glVertex2d(x1, y + i * height); // right 
} 
glEnd(); 
+0

нуждался в glShadeModel (GL_SMOOTH) ; Спасибо в любом случае, мне нужно было использовать первое решение для их окраски в порядке :) – NetherSoul