C ++ OpenGL каркасный куб рендеринг пустой

Я просто пытаюсь нарисовать кучу линий, которые составляют «куб». Я не могу понять, почему это производит черный экран. Отладчик не ломается ни в одной точке.

Я уверен, что это проблема с моими указателями, так как я прилично справляюсь с ними только в обычном c ++, а в OpenGL это становится еще хуже.

const char* vertexSource =
"#version 150\n""in vec3 position;""void main() {""   gl_Position = vec4(position, 1.0);""}";

const char* fragmentSource =
"#version 150\n""out vec4 outColor;""void main() {""   outColor = vec4(1.0, 1.0, 1.0, 1.0);""}";

int main() {

initializeGLFW();

// Initialize GLEW
glewExperimental = GL_TRUE;
glewInit();

// Create Vertex Array Object
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

// Create a Vertex Buffer Object and copy the vertex data to it
GLuint vbo;
glGenBuffers( 1, &vbo );

float vertices[] = {
1.0f,  1.0f,  1.0f, // Vertex 0 (X, Y, Z)
-1.0f,  1.0f,  1.0f, // Vertex 1 (X, Y, Z)
-1.0f, -1.0f,  1.0f, // Vertex 2 (X, Y, Z)
1.0f, -1.0f,  1.0f, // Vertex 3 (X, Y, Z)
1.0f,  1.0f, -1.0f, // Vertex 4 (X, Y, Z)
-1.0f,  1.0f, -1.0f, // Vertex 5 (X, Y, Z)
-1.0f, -1.0f, -1.0f, // Vertex 6 (X, Y, Z)
1.0f, -1.0f, -1.0f  // Vertex 7 (X, Y, Z)
};

GLuint indices[] = {
0, 1,
1, 2,
2, 3,
3, 0,
4, 5,
5, 6,
6, 7,
7, 4,
0, 4,
1, 5,
2, 6,
3, 7
};

glBindBuffer( GL_ARRAY_BUFFER, vbo );
glBufferData( GL_ARRAY_BUFFER, sizeof( vertices ), vertices, GL_STATIC_DRAW );
//glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vbo);
//glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof( indices ), indices, GL_STATIC_DRAW );

// Create and compile the vertex shader
GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER );
glShaderSource( vertexShader, 1, &vertexSource, NULL );
glCompileShader( vertexShader );

// Create and compile the fragment shader
GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource( fragmentShader, 1, &fragmentSource, NULL );
glCompileShader( fragmentShader );

// Link the vertex and fragment shader into a shader program
GLuint shaderProgram = glCreateProgram();
glAttachShader( shaderProgram, vertexShader );
glAttachShader( shaderProgram, fragmentShader );
glBindFragDataLocation( shaderProgram, 0, "outColor" );
glLinkProgram (shaderProgram);
glUseProgram( shaderProgram);

// Specify the layout of the vertex data
GLint posAttrib = glGetAttribLocation( shaderProgram, "position" );
glEnableVertexAttribArray( posAttrib );
glVertexAttribPointer( posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0 );

// Main loop
while(glfwGetWindowParam(GLFW_OPENED)) {

// Clear the screen to black
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT );

// Draw lines from 2 vertices
glDrawElements(GL_LINES, sizeof(indices), GL_UNSIGNED_INT, indices );

// Swap buffers
glfwSwapBuffers();
}

// Clean up
glDeleteProgram( shaderProgram );
glDeleteShader( fragmentShader );
glDeleteShader( vertexShader );

//glDeleteBuffers( 1, &ebo );
glDeleteBuffers( 1, &vbo );

glDeleteVertexArrays( 1, &vao );

glfwTerminate();
exit( EXIT_SUCCESS );
}

РЕДАКТИРОВАТЬ: полный код, пытаясь рекомендации первого ответа. Все еще пусто.

#define GLEW_STATIC

#include <GL/glew.h>
#include <GL/glfw.h>
#include <iostream>

#pragma comment( lib, "glfw.lib")
#pragma comment( lib, "opengl32.lib")
#pragma comment( lib, "glew32s.lib")

const char* vertexSource =
"#version 150\n""in vec3 position;""void main() {""   gl_Position = vec4(position.x, position.y, position.z - 0.9, 1.0);""}";

const char* fragmentSource =
"#version 150\n""out vec4 outColor;""void main() {""   outColor = vec4(1.0, 1.0, 1.0, 1.0);""}";

void initializeGLFW();

int main() {

initializeGLFW();

// Initialize GLEW
glewExperimental = GL_TRUE;
glewInit();

// Create Vertex Array Object
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

// Create a Vertex Buffer Object and copy the vertex data to it
GLuint vbo;
glGenBuffers( 1, &vbo );

float vertices[] = {
1.0f,  1.0f,  1.0f, // Vertex 0 (X, Y, Z)
-1.0f,  1.0f,  1.0f, // Vertex 1 (X, Y, Z)
-1.0f, -1.0f,  1.0f, // Vertex 2 (X, Y, Z)
1.0f, -1.0f,  1.0f, // Vertex 3 (X, Y, Z)
1.0f,  1.0f, -1.0f, // Vertex 4 (X, Y, Z)
-1.0f,  1.0f, -1.0f, // Vertex 5 (X, Y, Z)
-1.0f, -1.0f, -1.0f, // Vertex 6 (X, Y, Z)
1.0f, -1.0f, -1.0f  // Vertex 7 (X, Y, Z)
};

size_t vertCount = sizeof( vertices ) / sizeof( float );
for( size_t i = 0; i < vertCount; ++i ) {
vertices[i] /= 2.0f;
}

GLubyte indices[] = {
0, 1,
1, 2,
2, 3,
3, 0,
4, 5,
5, 6,
6, 7,
7, 4,
0, 4,
1, 5,
2, 6,
3, 7
};

glBindBuffer( GL_ARRAY_BUFFER, vbo );
//glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vbo);
glBufferData( GL_ARRAY_BUFFER, sizeof( vertices ), vertices, GL_STATIC_DRAW );

// Create and compile the vertex shader
GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER );
glShaderSource( vertexShader, 1, &vertexSource, NULL );
glCompileShader( vertexShader );

// Create and compile the fragment shader
GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource( fragmentShader, 1, &fragmentSource, NULL );
glCompileShader( fragmentShader );

// Link the vertex and fragment shader into a shader program
GLuint shaderProgram = glCreateProgram();
glAttachShader( shaderProgram, vertexShader );
glAttachShader( shaderProgram, fragmentShader );
glBindFragDataLocation( shaderProgram, 0, "outColor" );
glLinkProgram (shaderProgram);
glUseProgram( shaderProgram);

// Specify the layout of the vertex data
GLint posAttrib = glGetAttribLocation( shaderProgram, "position" );
glEnableVertexAttribArray( posAttrib );
glVertexAttribPointer( posAttrib, 3, GL_FLOAT, GL_FALSE, 0, vertices );

// Main loop
while(glfwGetWindowParam(GLFW_OPENED)) {

// Clear the screen to black
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT );

// Draw lines from 2 vertices
glDrawElements(GL_LINES, 24, GL_UNSIGNED_BYTE, indices);

// Swap buffers
glfwSwapBuffers();
}

// Clean up
glDeleteProgram( shaderProgram );
glDeleteShader( fragmentShader );
glDeleteShader( vertexShader );

//glDeleteBuffers( 1, &ebo );
glDeleteBuffers( 1, &vbo );

glDeleteVertexArrays( 1, &vao );

glfwTerminate();
exit( EXIT_SUCCESS );
}

void initializeGLFW() {
glfwInit();
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 2 );
glfwOpenWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );

glfwOpenWindowHint( GLFW_WINDOW_NO_RESIZE, GL_TRUE );
glfwOpenWindow( 800, 600, 0, 0, 0, 0, 0, 0, GLFW_WINDOW );
glfwSetWindowTitle( "OpenGL" );
}

5

Решение

«По умолчанию» проекция по существу glOrtho(-1, 1, -1, 1, -1, 1) с камерой на (0,0,0) глядя вниз по оси -Z.

Переместите камеру назад:

const char* vertexSource =
"#version 150\n""in vec3 position;""void main() {""   gl_Position = vec4(position.x, position.y, position.z - 0.9, 1.0);""}";

И сделайте ваш объект меньше:

float vertices[] = {
1.0f,  1.0f,  1.0f, // Vertex 0 (X, Y, Z)
-1.0f,  1.0f,  1.0f, // Vertex 1 (X, Y, Z)
-1.0f, -1.0f,  1.0f, // Vertex 2 (X, Y, Z)
1.0f, -1.0f,  1.0f, // Vertex 3 (X, Y, Z)
1.0f,  1.0f, -1.0f, // Vertex 4 (X, Y, Z)
-1.0f,  1.0f, -1.0f, // Vertex 5 (X, Y, Z)
-1.0f, -1.0f, -1.0f, // Vertex 6 (X, Y, Z)
1.0f, -1.0f, -1.0f  // Vertex 7 (X, Y, Z)
};

size_t vertCount = sizeof( vertices ) / sizeof( float );
for( size_t i = 0; i < vertCount; ++i )
{
vertices[i] /= 2.0f;
}

конверт

Полное:

#include <GL/glew.h>
#include <GL/glfw.h>
#include <cstdlib>

const char* vertexSource =
"#version 150\n""in vec3 position;""void main() {""   gl_Position = vec4(position.x, position.y, position.z - 0.9, 1.0);""}";

const char* fragmentSource =
"#version 150\n""out vec4 outColor;""void main() {""   outColor = vec4(1.0, 1.0, 1.0, 1.0);""}";

void initializeGLFW()
{
glfwInit();
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 2 );
glfwOpenWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );

glfwOpenWindowHint( GLFW_WINDOW_NO_RESIZE, GL_TRUE );
glfwOpenWindow( 800, 600, 0, 0, 0, 0, 0, 0, GLFW_WINDOW );
glfwSetWindowTitle( "OpenGL" );
}

int main()
{
initializeGLFW();

// Initialize GLEW
glewExperimental = GL_TRUE;
glewInit();

// Create Vertex Array Object
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

// Create a Vertex Buffer Object and copy the vertex data to it
GLuint vbo;
glGenBuffers( 1, &vbo );

float vertices[] =
{
1.0f,  1.0f,  1.0f, // Vertex 0 (X, Y, Z)
-1.0f,  1.0f,  1.0f, // Vertex 1 (X, Y, Z)
-1.0f, -1.0f,  1.0f, // Vertex 2 (X, Y, Z)
1.0f, -1.0f,  1.0f, // Vertex 3 (X, Y, Z)
1.0f,  1.0f, -1.0f, // Vertex 4 (X, Y, Z)
-1.0f,  1.0f, -1.0f, // Vertex 5 (X, Y, Z)
-1.0f, -1.0f, -1.0f, // Vertex 6 (X, Y, Z)
1.0f, -1.0f, -1.0f  // Vertex 7 (X, Y, Z)
};

size_t vertCount = sizeof( vertices ) / sizeof( float );
for( size_t i = 0; i < vertCount; ++i )
{
vertices[i] /= 2.0f;
}

GLuint indices[] =
{
0, 1,
1, 2,
2, 3,
3, 0,
4, 5,
5, 6,
6, 7,
7, 4,
0, 4,
1, 5,
2, 6,
3, 7
};

glBindBuffer( GL_ARRAY_BUFFER, vbo );
glBufferData( GL_ARRAY_BUFFER, sizeof( vertices ), vertices, GL_STATIC_DRAW );

// Create and compile the vertex shader
GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER );
glShaderSource( vertexShader, 1, &vertexSource, NULL );
glCompileShader( vertexShader );

// Create and compile the fragment shader
GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource( fragmentShader, 1, &fragmentSource, NULL );
glCompileShader( fragmentShader );

// Link the vertex and fragment shader into a shader program
GLuint shaderProgram = glCreateProgram();
glAttachShader( shaderProgram, vertexShader );
glAttachShader( shaderProgram, fragmentShader );
glBindFragDataLocation( shaderProgram, 0, "outColor" );
glLinkProgram (shaderProgram);
glUseProgram( shaderProgram);

// Specify the layout of the vertex data
GLint posAttrib = glGetAttribLocation( shaderProgram, "position" );
glEnableVertexAttribArray( posAttrib );
glVertexAttribPointer( posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0 );

// Main loop
while(glfwGetWindowParam(GLFW_OPENED))
{
// Clear the screen to black
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT );

// Draw lines from 2 vertices
glDrawElements(GL_LINES, sizeof(indices), GL_UNSIGNED_INT, indices );

// Swap buffers
glfwSwapBuffers();
}

// Clean up
glDeleteProgram( shaderProgram );
glDeleteShader( fragmentShader );
glDeleteShader( vertexShader );

//glDeleteBuffers( 1, &ebo );
glDeleteBuffers( 1, &vbo );

glDeleteVertexArrays( 1, &vao );

glfwTerminate();
exit( EXIT_SUCCESS );
}
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]