Rick York
Я думаю, что второй параметр неверен. Вот прототип этой функции:
void glReadPixels( GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
GLvoid* data );
Первые два параметра-это место для начала чтения. Второй параметр, y, вероятно, также должен быть равен 0, но, конечно же, не winHeight, потому что это было бы недопустимым значением. Параметр y может быть не более чем winHeight-1.
Member 14131869
//LastX и LastY-это позиция мыши
glReadPixels(LastX, winHeight - 1 - LastY, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data);
но все равно он не возвращает допустимых значений.
Rick York
Обратите внимание, что вы используете GL_RGBA, поэтому вам нужно четыре байта для хранения данных для одного пикселя с этим аргументом.
Я попробовал это в своем маленьком приложении, которое я называю GLplayground с этим кодом :Скрыть скопировать код
void COpenGLView::OnLButtonDown( UINT nFlags, CPoint point )
{
trace( _T( "OnLButtonDown at %d,%d - size is %d,%d\n" ),
point.x, point.y, m_WinSize.cx, m_WinSize.cy );
int ycoord = m_WinSize.cy - 1 - point.y;
UCHAR data[4] = { 0 };
glReadPixels( point.x, ycoord, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data );
traceDump( data, 4 );
__super::OnLButtonDown( nFlags, point );
}
и он работал и отображал значения, которые кажутся правильными. Я рекомендую попробовать что-то подобное. FWIW, это приложение MFC на windows. На этом сайте есть и другие примеры приложений, с которыми вы можете попробовать это сделать, если хотите. Этот код должен использоваться в любой функции обработчика щелчков мыши в другом фреймворке, за исключением того, что вам, вероятно, придется заменить вызовы trace и traceDump чем-то полезным для вас. Функция traceDump просто отображает шестнадцатеричный вывод, поэтому printf со строкой формата %02X для каждого байта пикселя будет работать одинаково.