簡體   English   中英

使用OpenGL和GLSL創建三角形

[英]Creating a triangle with OpenGL & GLSL

我想在屏幕上看到一個三角形。 代碼工作,除了沒有三角形。 我正在使用簡單的直通着色器來實現這一目標。

頂點着色器:

#version 150

in      vec3 vPos;
uniform mat4 projection_matrix;

void main () {
 gl_Position = vec4 (vPos, 1.0);
}

片段着色器:

#version 150

out vec4 fColor;

void main () {
 fColor = vec4 (1.0, 0.0, 0.0, 1.0);
}

代碼

/* Default rendering state / bool rendering = true; / Create a mouse event */
  CGEventRef event = CGEventCreate(NULL);

/* Set Vertex data (triangle)*/ GLfloat vertextData[] = { -1.0,-1.0,1.0, 0.0,1.0,1.0, 1.0,-1.0,1.0 };

/* Initializing vertex array object /
GLuint GEVertexArrayObject = NULL; /
Create vertex array object(s) (APPLE Extention)/ glGenVertexArraysAPPLE(1, &GEVertexArrayObject); / Bind vertex array object(s) and set set it -current- (APPLE Extention)/ glBindVertexArrayAPPLE(GEVertexArrayObject); / Initializing vertex array buffer / GLuint GEVertexBufferObject = NULL; / Create vertex-buffer objects / glGenBuffers(1, &GEVertexBufferObject); / Specify type of buffer and bind (selects)*/ glBindBuffer(GL_ARRAY_BUFFER, GEVertexBufferObject); /* Declare attribute (define data) and bind to vertex buffer object named as index # 0 */ glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0); /* Enable attribute so that the shader can use it. Name it as index # 0 / glEnableVertexAttribArray(0); / Transfer the actual vertex data into the buffer object */ glBufferData(GL_ARRAY_BUFFER,sizeof(vertextData),&vertextData,GL_STATIC_DRAW); /* Clearing screen settings / glClearColor(1,1,1,0); / Vertex Shader */ const char *vertexShader = { "#version 150\n" "in vec3 vPos;" "uniform mat4 projection_matrix;" "void main(){" " gl_Position = vec4(vPos,1.0);" "}" }; /* Fragment Shader */ const char fragmentShader = { "#version 150\n" "out vec4 fColor;" "void main(){" " fColor = vec4(1.0,0.0,0.0,1.0);" "}" }; / Create shader object */ GLuint vertexShaderObject = glCreateShader(GL_VERTEX_SHADER); GLuint fragmentShaderObject = glCreateShader(GL_FRAGMENT_SHADER); /* Associate source with shader object / glShaderSource(vertexShaderObject,1, &vertexShader, NULL); glShaderSource(fragmentShaderObject,1, &fragmentShader, NULL); / Compile vertex shader / glCompileShader(vertexShaderObject); / Validate if the compiling went well */ GLint errorVertexShaderObject = NULL; glGetShaderiv(vertexShaderObject,GL_COMPILE_STATUS,&errorVertexShaderObject); if(errorVertexShaderObject==GL_FALSE){ /* Compiling went wrong, get info from the log / / Check the size of the log */ GLint infologlengthVertexShaderObject = NULL; glGetShaderiv(vertexShaderObject,GL_INFO_LOG_LENGTH,&infologlengthVertexShaderObject); GLchar infologVertexShaderObject = new GLchar[infologlengthVertexShaderObject+1]; / Retrieve info from the log / GLsizei infologsizeVertexShaderObject = NULL; glGetShaderInfoLog(vertexShaderObject,infologlengthVertexShaderObject,NULL,infologVertexShaderObject); / Show info of log*/ std::cout<<"X VERTEX SHADER:"</ glCompileShader(fragmentShaderObject); / Validate if the compiling went well */ GLint errorFragmentShaderObject = NULL; glGetShaderiv(fragmentShaderObject,GL_COMPILE_STATUS,&errorFragmentShaderObject); if(errorFragmentShaderObject==GL_FALSE){ /* Compiling went wrong, get info from the log / / Check the size of the log */ GLint infologlengthFragmentShaderObject = NULL; glGetShaderiv(fragmentShaderObject,GL_INFO_LOG_LENGTH,&infologlengthFragmentShaderObject); GLchar infologFragmentShaderObject = new GLchar[infologlengthFragmentShaderObject+1]; / Retrieve info from the log / GLsizei infologsizeFragmentShaderObject = NULL; glGetShaderInfoLog(fragmentShaderObject,infologlengthFragmentShaderObject,NULL,infologFragmentShaderObject); / Show info of log*/ std::cout<<"X FRAGMENT SHADER:"</ GLuint shaderProgram = glCreateProgram(); / Poppulate shader program with shaders*/ glAttachShader(shaderProgram, vertexShaderObject); glAttachShader(shaderProgram, fragmentShaderObject); /* Layout location = 0 / glBindAttribLocation(shaderProgram,0,"vPos"); / Create an executable shader program*/ glLinkProgram(shaderProgram); GLint errorShaderProgram = NULL; glGetProgramiv(shaderProgram,GL_LINK_STATUS,&errorShaderProgram); if(errorShaderProgram==GL_TRUE){std::cout<<"√ Linked successful\n";} /* Set shader program as current */ glUseProgram(shaderProgram);

/* Keeps rendering until rendering = false / while(rendering){ / Stop rendering if the escape key is pressed / if(CGEventSourceKeyState(kCGEventSourceStateCombinedSessionState,53)){ / Stop rendering / rendering = false; / Exit with escape-key - notification / std::cout<<"- (info) The user has quit the program with the escape-key"< Finish current loop without executing upcoming methods */ continue; };

/* Get Mouse position */
CGPoint positionMouse = CGEventGetLocation(event);

/* Clear buffer */
glClear(GL_COLOR_BUFFER_BIT);

/* Draw to screen */
glDrawArrays(GL_TRIANGLES,0,3);

/* Flush opengl Commands*/
glFlush();
//glFinish();</code>

我剛剛在Windows上檢查了你的代碼。

  • 有一個錯字。 這個:

    const char fragmentShader ...

    應該是:

    const char* fragmentShader ......

  • 你忘了交換緩沖區: glSwapAPPLE(); aglSwapBuffers();

因此,如果您將解決這些問題以及其他代碼(主要是窗口和上下文創建代碼)是正確的,它將繪制您的三角形。

--- EDIT1 ---

為了避免特定於操作系統,非OpenGL的問題,您可能希望使用一些OpenGL實用程序庫,它將擺脫窗口創建,上下文創建和處理OS事件。 一些選擇:

  • GLUT
  • FreeGLUT
  • GLFW
  • SFML
  • 甚至是SDL

所有這些都易於使用,可以在我們的三個主要桌面平台上處理特定於操作系統的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM