Я хочу сохранить размер пикселя моего рисунка, пока я изменяю размер своего окна, поэтому я использую матрицу орфографической проекции. Я попытался использовать многопоточное для разделения опроса событий и задачи рендеринга, но это не решает мою проблему ... Кроме того, я хочу использовать DSA и избежать старых трюков OpenGL. Код: < /p>
std::unique_ptr Instance;
void framebuffer_size_callback(GLFWwindow*, int width, int height)
{
glViewport(0, 0, width, height);
const glm::mat4 projectionMatrix = glm::ortho(
0.0f, static_cast(width),
0.0f, static_cast(height),
-1.0f, 1.0f
);
for (const auto& child: Instance->m_children)
{
child->m_shader.use();
child->m_shader.set("projectionMatrix", projectionMatrix);
}
glClear(GL_COLOR_BUFFER_BIT);
}
< /code>
std::expected Application::init()
{
if (!glfwInit()) { return std::unexpected("GLFW could not initialize"); }
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE);
glfwWindowHint(GLFW_SAMPLES, 4);
m_window = glfwCreateWindow(700, 500, "Hello World!", nullptr, nullptr);
if (!m_window)
{
glfwTerminate();
return std::unexpected("Failed to create GLFW window");
}
glfwSetFramebufferSizeCallback(m_window, framebuffer_size_callback);
glfwMakeContextCurrent(m_window);
glfwSwapInterval(1);
if (!gladLoadGLLoader(reinterpret_cast(glfwGetProcAddress)))
{
return std::unexpected("Failed to initialize GLAD");
}
glEnable(GL_TEXTURE_2D);
glEnable(GL_MULTISAMPLE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glfwMakeContextCurrent(nullptr);
return {};
}
< /code>
int Application::run()
{
std::jthread renderThread(
[this]
{
glfwMakeContextCurrent(m_window);
begin();
framebuffer_size_callback(m_window, 700, 500);
while (m_running && !glfwWindowShouldClose(m_window))
{
glClearColor(
m_backgroundColor.r,
m_backgroundColor.g,
m_backgroundColor.b,
m_backgroundColor.a
);
glClear(GL_COLOR_BUFFER_BIT);
loop();
glfwSwapBuffers(m_window);
}
glfwMakeContextCurrent(nullptr);
}
);
while (!glfwWindowShouldClose(m_window))
{
glfwWaitEvents();
if (glfwWindowShouldClose(m_window)) { m_running = false; }
}
glfwDestroyWindow(m_window);
glfwTerminate();
return 42; //exit success

}
< /code>
//vertex shader hard-coded in C++
#version 460 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec4 color;
out vec4 COLOR;
uniform mat4 modelMatrix = mat4(1.0);
uniform mat4 projectionMatrix;
void main() {
mat4 Matrix = projectionMatrix * modelMatrix;
gl_Position = Matrix * vec4(position, 1.0);
COLOR = color;
}
< /code>
Компилятор: GCC в Clion. < /li>
Библиотека: GLFW, GLAD и GLM < /li>
OS: Windows 11 < /li>
GPU: NVIDIA GEFORCE RTX 4050 < /li>
< /> < /ul> < /> < /ul> < /> < /> < /> < /> < /u отвечать !

Подробнее здесь: https://stackoverflow.com/questions/796 ... gl-context