Kursy/ebooki OpenGL

0

Witam. Szukam jakis aktualnych kursów bądź ebooków z OpenGl, co najmniej z roku 2008 wzwyż, bo takie z roku 1999 nie jest cięzko znaleźć. Jakby ktoś miał jakis ebook albo pdf to bardzo proszę o wrzucenie. Chodzi mi o materiały dla początkujących. Dzięki ! :)

5

To jest dobry, 'nowoczesny' kurs: http://www.arcsynthesis.org/gltut/

Przy czym... Nie wiem czy nie lepiej byś wyszedł na tych kursach z 1999 roku.
Jako że jesteś początkujący to podejrzewam że nie będziesz od razu robił jakiegoś bardzo dużego projektu (20K linii kodu i wzwyż). W tym przypadku będziesz się z nowoczesnym OpenGL bardzo męczył.

Może mały przykład. W końcu pisze się w OpenGL po to żeby coś zobaczyć na ekranie.
Załóżmy że chcesz na ekranie narysować trójkąt...

Jeśli będziesz używał fixed-pipeline, cały kod będzie wyglądał mniej-więcej tak (ostrzeżenie: mogą być drobne przekręcenia nazw funkcji, piszę zazwyczaj w C# używając OpenTK (wrappera dla OpenGL))

void Display()
{
    glBegin(GL_TRIANGLES);
    glVertex2f(-1, 1);
    glVertex2f(1, 1);
    glVertex2f(0, -1);
    glEnd();
}

A teraz nowocześniejsza wersja:

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);

glUseProgram(theProgram);

glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

glDrawArrays(GL_TRIANGLES, 0, 3);

glDisableVertexAttribArray(0);
glUseProgram(0);

Nie wygląda źle, prawda? Ale żeby to zrobić trzeba najpierw wykonać parę drobnych ustawień...

const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
}; // trochę inne pozycje niż poprzednio

void InitializeVertexBuffer()
{
    glGenBuffers(1, &positionBufferObject);
    
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

Ale dalej nie wszystko, trzeba stworzyć shader który to wyświetli.
Vertex:

#version 330

layout(location = 0) in vec4 position;
void main()
{
    gl_Position = position;
}

Fragment:

#version 330

out vec4 outputColor;
void main()
{
   outputColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
}

Trzeba te shadery jakoś stworzyć:

void InitializeProgram()
{
    std::vector<GLuint> shaderList;
    
    shaderList.push_back(CreateShader(GL_VERTEX_SHADER, strVertexShader));
    shaderList.push_back(CreateShader(GL_FRAGMENT_SHADER, strFragmentShader));
    
    theProgram = CreateProgram(shaderList);

    std::for_each(shaderList.begin(), shaderList.end(), glDeleteShader);
}

No i wczytać:

GLuint CreateShader(GLenum eShaderType, const std::string &strShaderFile)
{
    GLuint shader = glCreateShader(eShaderType);
    const char *strFileData = strShaderFile.c_str();
    glShaderSource(shader, 1, &strFileData, NULL);
    
    glCompileShader(shader);
    
    GLint status;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    if (status == GL_FALSE)
    {
        GLint infoLogLength;
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
        
        GLchar *strInfoLog = new GLchar[infoLogLength + 1];
        glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
        
        const char *strShaderType = NULL;
        switch(eShaderType)
        {
        case GL_VERTEX_SHADER: strShaderType = "vertex"; break;
        case GL_GEOMETRY_SHADER: strShaderType = "geometry"; break;
        case GL_FRAGMENT_SHADER: strShaderType = "fragment"; break;
        }
        
        fprintf(stderr, "Compile failure in %s shader:\n%s\n", strShaderType, strInfoLog);
        delete[] strInfoLog;
    }

	return shader;
}

A z nich stworzyć cały shader program:

GLuint CreateProgram(const std::vector<GLuint> &shaderList)
{
    GLuint program = glCreateProgram();
    
    for(size_t iLoop = 0; iLoop < shaderList.size(); iLoop++)
    	glAttachShader(program, shaderList[iLoop]);
    
    glLinkProgram(program);
    
    GLint status;
    glGetProgramiv (program, GL_LINK_STATUS, &status);
    if (status == GL_FALSE)
    {
        GLint infoLogLength;
        glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
        
        GLchar *strInfoLog = new GLchar[infoLogLength + 1];
        glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog);
        fprintf(stderr, "Linker failure: %s\n", strInfoLog);
        delete[] strInfoLog;
    }
    
    for(size_t iLoop = 0; iLoop < shaderList.size(); iLoop++)
        glDetachShader(program, shaderList[iLoop]);

    return program;
}

To tyle jeśli chodzi o rysowanie trójkąta.

0

Dzięki wielkie :) No my na studiach właśnie uczymy się pisać tym sposobem:
[code]
void Display()
{
glBegin(GL_TRIANGLES);
glVertex2f(-1, 1);
glVertex2f(1, 1);
glVertex2f(0, -1);
glEnd();
}[/code]

I raczej właśnie o takie coś mi chodzi. Tylko że ten nauczyciel nic nie potrafi nauczyć a projekt mamy zrobić :D
Aaa własnie, jeszcze fajnie jakby taki tutorial był po polsku bo jednak angielski techniczny nie jest taki prosty do zrozumienia...

1 użytkowników online, w tym zalogowanych: 0, gości: 1