![](/img/trans.png)
[英]OpenGL GLSL texture function always returning vec4(1,1,1,1), white triangle
[英]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事件。 一些選擇:
所有這些都易於使用,可以在我們的三個主要桌面平台上處理特定於操作系統的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.