关于在opengl上绘制矩形的问题
Question about drawing rectangle on opengl
题目要求在键盘上按"r"时绘制矩形。我尝试编写一个函数来绘制这个矩形。字符回调函数是正确的,它给我的反馈是我已经按了"r"。我不知道如何使三角形出现。我在函数中添加了这一行glfwSwapBuffers(window)
,但它仍然无法正常工作。提前感谢您的帮助。
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <vector>
#include <cmath>
#include <iostream>
#define WINDOW_WIDTH 900
#define WINDOW_HEIGHT 600
float frameBuffer[WINDOW_HEIGHT][WINDOW_WIDTH][3];
bool mask[WINDOW_HEIGHT][WINDOW_WIDTH];
GLFWwindow *window;
void display()
{
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex2i(50, 90);
glVertex2i(100, 90);
glVertex2i(100, 150);
glVertex2i(50, 150);
glEnd();
glFlush();
}
void CharacterCallback(GLFWwindow* lWindow, unsigned int key)
{
if(char(key) == 'r')
display();
}
void Init()
{
glfwInit();
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "- <xx>", NULL, NULL);
glfwMakeContextCurrent(window);
glfwSetCharCallback(window, CharacterCallback);
glewExperimental = GL_TRUE;
glewInit();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
ClearFrameBuffer();
}
int main()
{
Init();
while (glfwWindowShouldClose(window) == 0)
{
glClear(GL_COLOR_BUFFER_BIT);
Display();
glFlush();
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
当你按glBegin
/glEnd
序列绘制时,每个顶点坐标都由当前视图矩阵和当前投影矩阵变换。
绘制场景时,在变换之后,几何体的坐标必须在剪辑 space 中,分别归一化设备 space。归一化设备 space 是一个立方体积,左下在前 (-1, -1, -1),右上在远 (1, 1, 1)。此立方体中的所有几何体在视口上都是 "visible"。此立方体之外的所有几何体都被剪裁。
如果要使用 window ("pixel") 坐标绘制场景,则必须设置 orthographic projection by glOrtho
。在正交投影中,视图 space 坐标线性转换为剪辑 space 坐标。这意味着正交投影矩阵可用于缩放视图 space 坐标。例如:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, (GLdouble)WINDOW_WIDTH, (GLdouble)WINDOW_HEIGHT, 0.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
您可以在 Init()
结束时执行此操作。
题目要求在键盘上按"r"时绘制矩形。我尝试编写一个函数来绘制这个矩形。字符回调函数是正确的,它给我的反馈是我已经按了"r"。我不知道如何使三角形出现。我在函数中添加了这一行glfwSwapBuffers(window)
,但它仍然无法正常工作。提前感谢您的帮助。
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <vector>
#include <cmath>
#include <iostream>
#define WINDOW_WIDTH 900
#define WINDOW_HEIGHT 600
float frameBuffer[WINDOW_HEIGHT][WINDOW_WIDTH][3];
bool mask[WINDOW_HEIGHT][WINDOW_WIDTH];
GLFWwindow *window;
void display()
{
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex2i(50, 90);
glVertex2i(100, 90);
glVertex2i(100, 150);
glVertex2i(50, 150);
glEnd();
glFlush();
}
void CharacterCallback(GLFWwindow* lWindow, unsigned int key)
{
if(char(key) == 'r')
display();
}
void Init()
{
glfwInit();
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "- <xx>", NULL, NULL);
glfwMakeContextCurrent(window);
glfwSetCharCallback(window, CharacterCallback);
glewExperimental = GL_TRUE;
glewInit();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
ClearFrameBuffer();
}
int main()
{
Init();
while (glfwWindowShouldClose(window) == 0)
{
glClear(GL_COLOR_BUFFER_BIT);
Display();
glFlush();
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
当你按glBegin
/glEnd
序列绘制时,每个顶点坐标都由当前视图矩阵和当前投影矩阵变换。
绘制场景时,在变换之后,几何体的坐标必须在剪辑 space 中,分别归一化设备 space。归一化设备 space 是一个立方体积,左下在前 (-1, -1, -1),右上在远 (1, 1, 1)。此立方体中的所有几何体在视口上都是 "visible"。此立方体之外的所有几何体都被剪裁。
如果要使用 window ("pixel") 坐标绘制场景,则必须设置 orthographic projection by glOrtho
。在正交投影中,视图 space 坐标线性转换为剪辑 space 坐标。这意味着正交投影矩阵可用于缩放视图 space 坐标。例如:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, (GLdouble)WINDOW_WIDTH, (GLdouble)WINDOW_HEIGHT, 0.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
您可以在 Init()
结束时执行此操作。