Chciałem wyrenderować trójkąt przy pomocy biblioteki OpenGL jednak tylko "czyści" mi okno, a nic nie renderuje ;/ Mimo iż wszystko zrobiłem jak w książce, oto kod:
To funkcja do zainicjowania biblioteki:
PIXELFORMATDESCRIPTOR pfd; // pixel format descriptor structure
pfd = // pfd Tells Windows How We Want Things To Be
{
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
32, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored
16, // 16Bit Z-Buffer (Depth Buffer)
0, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
0, 0, 0 // Layer Masks Ignored
};
hUchwytKontekstu = GetDC(hUchwytOkna);
GLuint PixelFormat = ChoosePixelFormat(hUchwytKontekstu, &pfd);
SetPixelFormat(hUchwytKontekstu, PixelFormat, &pfd);
hUchwytRendera = wglCreateContext(hUchwytKontekstu);
wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
if (glewInit())
MessageBox(0, L"Brak mozliwosci zainicjowania glew!", L"Error", MB_ICONERROR);
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glViewport(0, 0, 400, 400);
glClearColor(1, 0, 0, 1);
glEnable(GL_TEXTURE_2D);
ShaderProgram = ZaladujShader("vertex.vers", "fragment.fras");
Uniform_macierz_transf = glGetUniformLocation(ShaderProgram, "mvp");
Attribute_polozenie_wierz = glGetAttribLocation(ShaderProgram, "textureposition");
static const GLfloat g_vertex_buffer_data[] = {
-50.0, 50.0, 0.0f,
-50.0, 0.0f, 0.0f,
50.0f, 0.0f, 0.0f,
50.0, 50.0, 0.0f,
-50.0, 50.0f, 0.0f,
50.0f, 0.0f, 0.0f,
-50.0, 50.0, 0.0f,
-50.0, 0.0f, 0.0f,
50.0f, 0.0f, 0.0f,
};
glGenBuffers(1, &nBuffor1);
glBindBuffer(GL_ARRAY_BUFFER, nBuffor1);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
macierzmvp = glm::mat4(1.0f);
macierzmvp = glm::ortho(-200.0, 200.0, -200.0, 200.0);
wglMakeCurrent(NULL, NULL);
A tutaj do wyrenderowania trójkąta:
wglMakeCurrent(hUchwytKontekstu, hUchwytRendera);
glUseProgram(ShaderProgram);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUniformMatrix4fv(Uniform_macierz_transf, 0, FALSE, &macierzmvp[0][0]);
// 1rst attribute buffer : vertices
glEnableVertexAttribArray(Attribute_polozenie_wierz);
glBindBuffer(GL_ARRAY_BUFFER, nBuffor1);
glVertexAttribPointer(
0, // attribute 0. No particular reason for 0, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// Draw the triangle !
glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle
glDisableVertexAttribArray(Attribute_polozenie_wierz);
SwapBuffers(hUchwytKontekstu);
wglMakeCurrent(NULL, NULL);
Podstawowy shader wierzchołków:
#version 120
attribute vec3 vertexposition;
uniform mat4 mvp;
mat4 mac;
void main()
{
gl_Position = mvp * vec4(vertexposition.xy, 0, 1);
}
I fragmentów:
#version 120
void main()
{
gl_FragColor = vec4(1, 1, 1, 1);
}
Sprawdziłem chyba wszystkie możliwości i nadal nic tylko czyści mi na czerwono okno i nie widzę żadnego trójkąta :(