Member 14131869 Ответов: 2

Как я могу прочитать цвет пикселя в opengl


Я пытаюсь прочитать цвет пикселя. но по какой-то причине это не работает

ВОТ ЭТОТ КОД :
ModelClassObject.UseShader(SelectionRender.GetShaderProgram());
			glUniformMatrix4fv(SelectionRender.GetUnifromModelID(), 1, GL_FALSE, glm::value_ptr(Model));
			glUniformMatrix4fv(SelectionRender.GetUnifromProjectionID(), 1, GL_FALSE, glm::value_ptr(Projection));
			glUniformMatrix4fv(SelectionRender.GetUniformView(), 1, GL_FALSE, glm::value_ptr(Camera.CalculateViewMatrix()));
			ModelClassObject.DrawTriangles();
			glFlush();
			glFinish();
			glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
			unsigned char data[3];
			glReadPixels(0, winHeight, winWidth, winHeight, GL_RGB, GL_UNSIGNED_BYTE, data);
			std::cout 
				<< "  R  "
				<< data[0]
				<< "  G  "
				<< data[1]
				<< "  B  "
				<< data[2] 
				<< std::endl;

ВЫХОД :
data[0] = 0xcc
data[1] = 0xcc
данные[2] = 0xcc

Что я уже пробовал:

Я не могу понять, что случилось...

2 Ответов

Рейтинг:
20

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 для каждого байта пикселя будет работать одинаково.

Рейтинг:
1

Member 14131869

Спасибо за быстрый ответ,
Я включил шестнадцатеричную систему счисления. Я отключил его и он работал


Richard Deeming

Если вы хотите ответить на решение, нажмите кнопку "есть вопрос или комментарий?" нажмите кнопку под этим решением и оставьте комментарий.

НЕ оставьте свой комментарий в разделе "Добавить свой решение вот" шкатулка.