Выбор цвета OpenGL RGBA против RGB

Я хотел бы реализовать выбор цвета с помощью этих трех методов:

void ColorIndex(uint colorIndex)
{
glColor4ubv((GLubyte *)&colorIndex);
}

void ColorIndices(vector<uint> &colorIndices)
{
GLubyte *colorPtr = (GLubyte *)&colorIndices[0];
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colorPtr);
}

void ReadSelectedIndices(int x, int y, int width, int height, uint *selectedIndices)
{
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, selectedIndices);
}

В основном они упаковывают целое число без знака (32 бита) в 4 байта R, G, B, A. Это просто и очень быстро по сравнению с GL_SELECT.

Проблема в том, что иногда это не работает. У меня не работает на Windows с графической картой NVIDIA 9800. У меня это работает на ATI Radeon 4670 в Mac / Windows.

Я думал, что проблема в альфа-канале, поэтому я попробовал эту реализацию:

union RgbColor
{
GLuint colorIndex : 24;
GLubyte components[3];
struct
{
GLubyte r;
GLubyte g;
GLubyte b;
};
};

void ColorIndex(uint colorIndex)
{
RgbColor color;
color.colorIndex = colorIndex;
glColor3ubv(color.components);
}

vector<GLubyte> colorComponents;

void ColorIndices(vector<uint> &colorIndices)
{
colorComponents.clear();

for (uint i = 0; i < colorIndices.size(); i++)
{
RgbColor color;
color.colorIndex = colorIndices[i];

colorComponents.push_back(color.components[0]);
colorComponents.push_back(color.components[1]);
colorComponents.push_back(color.components[2]);
}

GLubyte *colorPtr = (GLubyte *)&colorComponents[0];
glColorPointer(3, GL_UNSIGNED_BYTE, 0, colorPtr);
}

const uint kMaxSelectedIndicesCount = 2000 * 2000;  // max width * max height resolution

GLubyte colorBuffer[kMaxSelectedIndicesCount * 3];

void ReadSelectedIndices(int x, int y, int width, int height, uint *selectedIndices)
{
uint count = (uint)width * (uint)height;

memset(colorBuffer, 0, count * 3);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, colorBuffer);
GetGLError();

for (uint i = 0; i < count; i++)
{
RgbColor color;
color.components[0] = colorBuffer[i * 3 + 0];
color.components[1] = colorBuffer[i * 3 + 1];
color.components[2] = colorBuffer[i * 3 + 2];

selectedIndices[i] = color.colorIndex;
}
}

Теперь и на видеокартах, и на ОС работает выбор, но иногда выделяются плохие вершины (за пределами прямоугольника выбора).

Как это может произойти? Есть ли лучший способ реализовать выбор цвета, который является надежным и всегда корректным на разных видеокартах?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]