OpenGL конвертировать ClipCoord в ScreenCoord - PullRequest
0 голосов
/ 15 октября 2019

Я хочу преобразовать ClipCoord в ScreenCoord, но я не знаю, как правильно получить ширину и высоту Canvas. (Холст = область рисования в плоскости изображения)

glm::vec4 clipCoords = vec4f(0.1f, 0.3f, 1.0f, 1.0f) // random point

float canvasWidth = 2;
float canvasHeight = 2;

GLfloat ndcX = (clipCoords.x + canvasWidth / 2.0f) / canvasWidth;
GLfloat ndcY = (clipCoords.y + canvasHeight / 2.0f) / canvasHeight;

GLint pixelX = ndcX * SCREEN_WIDTH;
GLint pixelY = (1 - ndcY) * SCREEN_HEIGHT;

В OpenGL холст - это ближняя плоскость в перспективной проекции.

Я нашел старую нить с тем же вопросом

поэтому у меня есть ответ.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Это зависит от библиотеки, которую вы используете для создания окна с контекстом OpenGL. Например, если вы используете GLFW (кстати, отличная библиотека для создания окон), вы получите размер кадрового буфера с glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height), например так:

int width;
int height;
glfwGetFramebufferSize(window, &width, &height);

Но это только размер кадрового буфера, если вы хотитеполучите область просмотра, которая показывает, сколько пикселей будет записано из OpenGL в кадровый буфер, glGetIntegerv(GLenum pname, GLint* data - это то, что вы ищете:

GLint* viewport = new GLint[4];
glGetIntegerv(GL_VIEWPORT, viewport);
int x =      viewport[0];
int y =      viewport[1];
int width =  viewport[2];
int height = viewport[3];
delete[] viewport;
0 голосов
/ 15 октября 2019

Итак, вам нужна функция, которая берет точку glm :: vec2 (преобразует ее в glm::vec2, используя matrix multiplication из матрицы камеры), а затем возвращает ее на экран по отображению значения.

Полезная ссылка может быть this

...