我不能理解為什么下面的例子中渲染的三角形是黑色的(自動插值不起作用)
INT WINAPI
WinMain(
HINSTANCE, HINSTANCE, LPSTR, int
)
{
HINSTANCE hInstance = GetModuleHandle(0)。
GLOBAL_INFO("應用程式開始")。
WNDCLASSA window_class{};
window_class.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
window_class.lpfnWndProc = WndProc;
window_class.hInstance = hInstance;
window_class.lpszClassName = "M9Main"/span>;
if (! RegisterClassA(&window_class))
{
return 0;
}
HWND window_handle = CreateWindow(
"M9Main",
"M9",
ws_overlappedwindow,
cw_usedefault, cw_usedefault,
r_width, r_height,
NULL, NULL。
hInstance。
NULL, hInstance, NULL.
);
if (! window_handle)
{
return 0;
}
if (!win32_opengl_init(window_handle))
{
return 0;
}
ShowWindow(window_handle, SW_SHOWDEFAULT)。
global_running = M9_TRUE;
const char* vs =
#include "shaders/sample.vs.glsl"/span>
const char* fs =
#include "shaders/sample.fs.glsl"
u32 shader = opengl_load_shaders(vs, fs)。
r32 vertices[] {
0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
};
u32 VBO{}。
u32 VAO{};
glGenVertexArrays(1, &VAO)。
glGenBuffers(1, &VBO)。
glBindVertexArray(VAO)。
glBindBuffer(GL_ARRAY_BUFFER, VBO)。
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW)。
glVertexAttribPointer(
0, 2,
gl_float, gl_false,
5 * sizeof(r32), (void*)0.
);
glEnableVertexAttribArray(0)。
glVertexAttribPointer(
1, 3,
gl_float, gl_false,
5 * sizeof(r32), (void*)(sizeof(r32) *2)
);
glEnableVertexAttribArray(1)。
glUseProgram(shader);
i32 uDisp = glGetUniformLocation(shader, "uDisp"/span>)。
r32 disp[2]{}。
r32 delta = 0.001f;
const game_controller_state& ctl = global_game_input.keyboard_state。
while (global_running)
{
process_messages(global_game_input)。
glClearColor(0.2f, 0.3f, 0.3f, 1.0f) 。
glClear(GL_COLOR_BUFFER_BIT)。
if (ctl.move_up.pressed)
{
disp[1] = delta;
}
else if (ctl.move_down.pressed)
{
disp[1] -= delta;
}
else if (ctl.move_left.pressed)
{
disp[0] -= delta;
}
else if (ctl.move_right.pressed)
{
disp[0] = delta;
}
glUniform2f(uDisp, disp[0], disp[1])。)
glBindVertexArray(VAO)。
glDrawArrays(GL_TRIANGLES, 0, 3) 。
SwapBuffers(opengl_context.device_ctx)。
}
return 0;
}
我的著色器:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
統一 vec2 uDisp;
out vec3 Color;
void main()
{
gl_Position = vec4(aPos.x uDisp.x, aPos.y uDisp.y, 0.0f, 1.0) 。
顏色=aColor。
};
#version 330 core
out vec4 outcolor;
in vec3 inColor;
void main()
{
outcolor = vec4(inColor, 1.0f) 。
};
我正在手動加載OpenGL(沒有GLAD或其他東西),而且我沒有使用GLFW這樣的庫來管理視窗。所以我應該初始化OpenGL背景關系并描述像素格式。這個東西是在win32_opengl_init函式中完成的:
static b32
win32_opengl_init(HWND hwnd)
{
opengl_context.device_ctx = GetDC(hwnd)。
HDC& dc = opengl_context.device_ctx;
PIXELFORMATDESCRIPTOR pfd{};
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR)。
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 24;
pfd.cStencilBits = 8;
pfd.iLayerType = PFD_MAIN_PLANE;
// TODO:使用最后一個錯誤代碼顯示錯誤資訊。
if (!SetPixelFormat(dc, ChoosePixelFormat(dc, &pfd), &pfd))
{
GLOBAL_ERROR("Canot set pixel format: %lu", GetLastError())。
return M9_FALSE。
}
HGLRC rendering_context = wglCreateContext(dc)。
if (! rendering_context)
{
GLOBAL_ERROR("Cannot create rendering context: %lu"/span>, GetLastError())。
return M9_FALSE。
}
opengl_context.rendering_ctx = rendering_context;
if (!win32_opengl_make_ctx_current(opengl_context))
{
GLOBAL_ERROR("Cannot make rendering context current: %lu"/span>, GetLastError())。
return M9_FALSE。
}
/*加載函式 */
GLOBAL_INFO("OpenGL initialized successfully")。
return M9_TRUE。
問題可能出在我的像素格式描述上,因為我沒有看到我正在做的事情和對應的教程中的內容有任何其他的不同。https://learnopengl.com/Getting-started/Hello-Triangle
當我開始使用GLFW來創建opengl背景關系時,這個問題就消失了 ... 但是我想自己動手做所有的事情,不需要任何庫。
uj5u.com熱心網友回復:
我不能理解為什么下面的例子中渲染的三角形是黑色的(自動插值不起作用)
但是,這很容易看出:
你的頂點著色器是什么?
你的頂點著色器:
out vec3 Color;
你的片段著色器:
in vec3 inColor;
這些并不匹配,所以inColor在你的片段著色器中只是未定義。
當我開始使用GLFW來創建opengl背景關系時,這個問題就消失了。
我真的不明白使用GLFW怎么會不遇到上面的問題。Btw.,當你創建你的背景關系時,我建議你明確地創建一個核心組態檔背景關系,如果你想用wgl手動完成,它需要你大量的模板代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/320296.html
標籤:
