Градиентная «митра» в OpenGL показывает швы на стыках

Я провожу несколько очень простых экспериментов над 2D работой в GL. Я пытаюсь нарисовать «рамку рисунка» вокруг прямоугольной области. Я хотел бы, чтобы рама имела последовательный градиент по всему периметру, поэтому я создаю ее с геометрией, которая выглядит как четыре квадрата, по одному с каждой стороны рамы, суженные, чтобы образовывать трапеции, которые эффективно соединяются под углом. .

Координаты вершин одинаковы для "внутреннего" и "внешнего" прямоугольников, а цвета одинаковы для всех внутренних и всех внешних, поэтому я ожидал увидеть идеальное смешение по краям.

Но обратите внимание на изображение ниже, как кажется, что в углу соединения есть «шов», который светлее, чем должен быть.

Я чувствую, что в математике концептуально не хватает чего-то, что объясняет это. Этот артефакт каким-то образом является результатом крутизны градиента? Если я изменю все цвета на непрозрачный синий (скажем), я получу идеальную сплошную синюю рамку, как и ожидалось.

Обновление: Код добавлен ниже. Извините за многословие. Использование веера с двумя треугольниками для трапеций вместо четырехугольников.

Спасибо!

alt text

glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

// Prep the color array. This is the same for all trapezoids.
// 4 verts * 4 components/color = 16 values. 
GLfloat colors[16];
colors[0] = 0.0;
colors[1] = 0.0;
colors[2] = 1.0;
colors[3] = 1.0;
colors[4] = 0.0;
colors[5] = 0.0;
colors[6] = 1.0;
colors[7] = 1.0;

colors[8] = 1.0;
colors[9] = 1.0;
colors[10] = 1.0;
colors[11] = 1.0;
colors[12] = 1.0;
colors[13] = 1.0;
colors[14] = 1.0;
colors[15] = 1.0;

// Draw the trapezoidal frame areas. Each one is two triangle fans.
// Fan of 2 triangles = 4 verts = 8 values
GLfloat vertices[8];

float insetOffset = 100;
float frameMaxDimension = 1000;

// Bottom 
vertices[0] = 0;
vertices[1] = 0;
vertices[2] = frameMaxDimension;
vertices[3] = 0;
vertices[4] = frameMaxDimension - insetOffset;
vertices[5] = 0 + insetOffset;
vertices[6] = 0 + insetOffset;
vertices[7] = 0 + insetOffset;
glVertexPointer(2, GL_FLOAT , 0, vertices); 
glColorPointer(4, GL_FLOAT, 0, colors);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);    

// Left
vertices[0] = 0;
vertices[1] = frameMaxDimension;
vertices[2] = 0;
vertices[3] = 0;
vertices[4] = 0 + insetOffset;
vertices[5] = 0 + insetOffset;
vertices[6] = 0 + insetOffset;
vertices[7] = frameMaxDimension - inset;    
glVertexPointer(2, GL_FLOAT , 0, vertices); 
glColorPointer(4, GL_FLOAT, 0, colors);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);    

/* top & right would be as expected... */

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
7
задан Ben Zotto 30 December 2010 в 02:31
поделиться