在Java OpenGL中渲染彩虹幽灵不会混合颜色



修复:需要一个glShadeModel(GL_SMOOTH);

当前结果: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(…)只给出一个浮点数组的颜色从整数颜色值,这不是一个问题

Thanks in advance

你需要在四角处使用不同的颜色。

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();

最新更新