На самом деле, для полноты картины я упомяну, что есть одно возможное решение, если поддерживается расширение GL_ARB_imaging: GL_COLOR_MATRIX, который преобразует входящие значения RGBA.Вы можете установить верхнюю матрицу 3x3 на все 1 / 3.0 следующим образом:
GLFloat graymat[] = {.33,.33,.33,0,.33,.33,.33,0,.33,.33,.33,0,0,0,0,1};
glMatrixMode(GL_COLOR_MATRIX)
glLoadIdentity()
glMultMatrixf(graymat)
Как бы здорово это не звучало, хотя не все драйверы поддерживают это аппаратно, что означает, что в зависимости от вашей реализации opengl, вашДрайвер может: A) полностью игнорировать цветовую матрицу, B) переключиться на программный рендеринг или C) (если расширение не поддерживается) вызвать GLError.
Если вы пишете свой код для ограниченного набора платформ, и они поддерживают это расширение, то это будет самый простой способ.В противном случае вам понадобится другой подход.