固定:需要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(...)只从整数颜色值中给出一个浮点数组颜色,这不是问题
提前致谢
答案 0 :(得分: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();