当前位置:网站首页>Compile oglpg-9th-edition source code with clion

Compile oglpg-9th-edition source code with clion

2022-07-04 14:24:00 A Sheng 1990

  OpenGL It is a software library that can access the characteristics of graphics hardware devices , its 1.0 Version released at 1994 year 7 month , Mainly used in computer graphics . With AR and VR The development of , Computer graphics algorithms will become increasingly important , Like ray tracing [RayTracing].

One . Compile source code

Use CLion open OGLPG-9th-Edition Source code [1], Create in the root directory build Folder , then cd build, Carry out orders cmake …, The error is reported as follows :

The solution is to comment CMakeLists.txt In the document 92-94 Line code :

Two . Have a problem

   Unable to open file encountered glfw3_d.lib The question is , Need to compile OGLPG-9th-Edition\lib\glfw Source code [3]:

Compiling solutions , stay OGLPG-9th-Edition\lib\glfw\build\src\Debug Can be found in glfw3.lib and glfw3.pdb file :

take glfw3.lib and glfw3.pdb Rename it to glfw3_d.lib and glfw3_d.pdb after , copy to OGLPG-9th-Edition\lib Below directory :

3、 ... and . Running example

Running example 01-keypress.cpp As shown below :

Running example 01-triangles.cpp As shown below :

Four .01-triangles.cpp Source code analysis

(1) Vertex shaders and fragment shaders
GLFW What is the library ?GLFW It's used to create OpenGL Context and a third-party library of operation windows . that Glew What is a library ? Due to the OpenGL Of API There are differences ,Glew[OpenGL Extension Wrangler Library] Just put these API An integrated library . Vertex Shader ( Including subdivision and geometric coloring ) Determines where an element should be on the screen , Slice coloring uses this information to determine what the color of a slice should be .
(2)OpenGL and C Data type correspondence

suffix data type C Language data type Corresponding OpenGL type
b8 An integer signed charGLbyte
s16 An integer signed shortGLshort
i32 An integer intGLint、GLsizei
f32 Bit floating point type floatGLfloat、GLclampf
d64 Bit floating point type doubleGLdouble、GLclampd
ub8 Bit unsigned integer unsigned charGLubyte
us16 Bit unsigned integer unsigned shortGLushort
ui32 Bit unsigned integer unsigned intGLuint、GLenum、GLbitfield

(3)01-triangles.cpp File source code and comments

#include "vgl.h"
#include "LoadShaders.h"

enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };

GLuint  VAOs[NumVAOs];
GLuint  Buffers[NumBuffers];

const GLuint  NumVertices = 6;

void init( void )
{
    // n: Specify the number of vertex array object names to generate 
    // arrays: Specifies the array to store the name of the generated vertex array object 
    //  Assign vertex array objects : return n Unused object names to array arrays in , Used as a vertex array object 
    glGenVertexArrays( NumVAOs, VAOs );

    // array: Specify the name of the bound vertex array 
    //  Create and bind a vertex array object 
    glBindVertexArray( VAOs[Triangles] );

    GLfloat  vertices[NumVertices][2] = {
        { -0.90f, -0.90f }, {  0.85f, -0.90f }, { -0.90f,  0.85f },  // Triangle 1
        {  0.90f, -0.85f }, {  0.90f,  0.90f }, { -0.85f,  0.90f }   // Triangle 2
    };

    // void glCreateBuffers(GLsizei n, GLuint* buffers);
    //  return n Currently unused cache object names ( Each represents a newly created cache object ), And save to buffers Array 
    glCreateBuffers( NumBuffers, Buffers );

    // void glBindBuffer(GLenum target, GLuint buffer);
    //  Name as buffer The cache object of is bound to target The specified cache join point .target Must be OpenGL One of the supported cache binding targets ,buffer It has to be through glCreateBuffers() The name of the assignment .
    //  If buffer It is the first time to be bound , Then the corresponding cache object will also be created .
    glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] );

    // void glBufferStorage(GLenum target, GLsizeiptr size, const void * data, GLbitfield flags);
    // glBufferStorage Create a new immutable data store for the object currently bound to the target buffer 
    glBufferStorage( GL_ARRAY_BUFFER, sizeof(vertices), vertices, 0);

    ShaderInfo  shaders[] =
    {
        { GL_VERTEX_SHADER, "media/shaders/triangles/triangles.vert" },
        { GL_FRAGMENT_SHADER, "media/shaders/triangles/triangles.frag" },
        { GL_NONE, NULL }
    };

    GLuint program = LoadShaders( shaders );
    glUseProgram( program );

    // glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
    // index: Attribute positions in shaders 
    // size: Indicates the number of components that need to be updated for each vertex , It can be 1、2、3、4 or GL_BGRA
    // type: Specify the data type of each element in the array 
    // normalized: Set whether the vertex data needs to be normalized before storage 
    // stride: The size offset value between every two elements in the array 
    // pointer: Indicates in the cache object , The offset value of the array data calculated from the starting position , Use basic system units byte
    glVertexAttribPointer( vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) );
    glEnableVertexAttribArray( vPosition );
}

void display( void )
{
    static const float black[] = { 0.0f, 0.0f, 0.0f, 0.0f };

    //  Clear the data in the frame cache before rendering 
    // GL_COLOR: Cache type cleared 
    // 0: Set the cache index to be cleared 
    // back: Set the color after clearing the cache 
    glClearBufferfv(GL_COLOR, 0, black);

    //  Select the vertex array to use as vertex data 
    glBindVertexArray( VAOs[Triangles] );

    //  Request rendering geometry 
    glDrawArrays( GL_TRIANGLES, 0, NumVertices );
}

int main( int argc, char** argv )
{
    // glfw Initialization and configuration 
    glfwInit();

    //  At the same time, create a new rendering window OpenGL Environmental Science , Used to execute rendering instructions 
    GLFWwindow* window = glfwCreateWindow(800, 600, "Triangles", NULL, NULL);

    //  Set up window Associated with the window in OpenGL The environment is the current environment 
    glfwMakeContextCurrent(window);
    //  initialization GL3W library , establish OpenGL Before environment , This direction must be called once 
    gl3wInit();

    //  Set the data used in the program 
    init();

    while (!glfwWindowShouldClose(window))
    {
        //  Rendering work 
        display();
        //  Swap the front-end and back-end caches of the window , Go back to the content and show it 
        glfwSwapBuffers(window);
        //  Handle all waiting events , Check any information returned by the operating system 
        glfwPollEvents();
    }

    //  Destroy the specified window and its context , Determine whether the window needs to be closed 
    glfwDestroyWindow(window);

    //  close GLFW library 
    glfwTerminate();
}

(4) Vertex shader triangles.vert Document code and comments

#version 400 core //OpenGL Color language version 

layout( location = 0 ) in vec4 vPosition; // Save vertex position information 

void main()
{
    gl_Position = vPosition; // Copy the input vertex position to the specified output position of the vertex shader 
}

(5) Slice shader file code and comments

#version 450 core

out vec4 fColor; // The color value corresponding to the slice 

void main()
{
    fColor = vec4(0.5, 0.4, 0.8, 1.0);
}

reference :
[1]The OpenGL Programming Guide 9th Edition:http://www.opengl-redbook.com/
[2]OpenGL Red Book Example Code:https://github.com/openglredbook/examples
[3]GLFW Source download - compile - Use :http://t.zoukankan.com/Doyoung-p-13690602.html
[4]OpenGL Programming Guide [ The first 9 edition ]

原网站

版权声明
本文为[A Sheng 1990]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/185/202207041115094054.html

随机推荐