使用OpenGL创建三角形&;GLSL

使用OpenGL创建三角形&;GLSL,opengl,geometry,glsl,Opengl,Geometry,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

我想在屏幕上画一个三角形。除了没有三角形外,代码是有效的。我使用简单的通过着色器来实现这个目标

顶点着色器:

#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); } 片段着色器:

#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); } 代码

/*默认呈现状态/
布尔渲染=真;
/创建鼠标事件*/
CGEventRef事件=CGEventCreate(NULL)

/*设置顶点数据(三角形)*/ GLfloat vertextData[]={ -1.0,-1.0,1.0, 0.0,1.0,1.0, 1.0,-1.0,1.0 };

/*正在初始化顶点数组对象/
GLuint GEVertexArrayObject=NULL; /创建顶点数组对象(APPLE扩展)/ glGenVertexArraysAPPLE(1和GEVertexArrayObject); /绑定顶点数组对象并将其设置为当前-(苹果扩展)/ glBindVertexArrayAPPLE(GEVertexArrayObject); /初始化顶点数组缓冲区/ GLuint GEVertexBufferObject=NULL; /创建顶点缓冲区对象/ glGenBuffers(1和GEVertexBufferObject); /指定缓冲区和绑定的类型(选择)*/ glBindBuffer(GL_数组_BUFFER,GEVertexBufferObject); /*声明属性(定义数据)并绑定到名为索引#0的顶点缓冲区对象*/ glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,0); /*启用属性,以便着色器可以使用它。将其命名为索引#0/ GlenableVertexAttributeArray(0); /将实际顶点数据传输到缓冲区对象中*/ glBufferData(GL_数组_缓冲区,sizeof(vertextData)和vertextData,GL_静态_绘图); /*清除屏幕设置/ glClearColor(1,1,1,0); /顶点着色器*/ 常量字符*顶点着色器={ “#版本150\n” “在vec3 VPO中;” “一致mat4投影矩阵;” “void main(){” “gl_位置=vec4(vPos,1.0);” "}" }; /*片段着色器*/ 常量字符碎片着色器={ “#版本150\n” “输出矢量4颜色;” “void main(){” “fColor=vec4(1.0,0.0,0.0,1.0);” "}" }; /创建着色器对象*/ GLuint vertexShaderObject=glCreateShader(GL_VERTEX_着色器); GLuint fragmentShaderObject=glCreateShader(GL\u FRAGMENT\u着色器); /*将源与着色器对象关联/ glShaderSource(vertexShaderObject,1和vertexShader,NULL); glShaderSource(fragmentShaderObject,1和fragmentShader,NULL); /编译顶点着色器/ glCompileShader(vertexShaderObject); /验证编译是否顺利*/ 闪烁错误VertexShaderObject=NULL; glGetShaderiv(vertexShaderObject、GL_COMPILE_STATUS和errorVertexShaderObject); 如果(errorVertexShaderObject==GL_FALSE){ /*编译出错,请从日志中获取信息/ /检查日志的大小*/ 闪烁信息长度VertexShaderObject=NULL; glGetShaderiv(vertexShaderObject、GL\u信息\u日志长度和InfologLength vertexShaderObject); GLchar infologVertexShaderObject=新GLchar[infologlengthVertexShaderObject+1]; /从日志中检索信息/ GLsizei infologsizeVertexShaderObject=NULL; glGetShaderInfoLog(vertexShaderObject,infologlengthVertexShaderObject,NULL,infologVertexShaderObject); /显示日志信息*/
我刚刚在Windows上检查了你的代码

  • 有一个打字错误,这是:

    const char fragmentShader

    应该是:

    const char*fragmentShader

  • 您忘记交换缓冲区:
    glSwapAPPLE();
    aglSwapBuffers();

因此,如果您要解决这些问题,并且您的代码(主要是窗口和上下文创建代码)是正确的,那么它将绘制三角形

--Edit1---

为了避免操作系统特定的非OpenGL内容出现问题,您可能希望使用一些OpenGL实用程序库,这将摆脱窗口创建、上下文创建和操作系统事件处理。一些选项:

  • 过剩
  • 免费供应
  • GLFW
  • SFML
  • 甚至SDL

所有这些工具都易于使用,并且可以在我们的三大桌面平台上处理特定于操作系统的内容。

Context kCGLPFAOpenGLProfile、static_cast(KCGLGLPVersion_3_2_Core)、KCGLPFAAAccelerated、kCGLPFANoRecovery、kCGLPFAColorSize、static_cast(24)、kCGLPFADepthSize、static_cast(16),/*kCGLPFADoubleBuffer,闪烁*/kCGLPFASupersample,静态_cast(0)很好,但不幸的是由于标记而删除了此内容。如果按“编辑”,您将看到指针。如我所说,应用程序工作正常(编译时无错误,运行正常)但三角形不会显示。此外,此应用程序中未应用交换缓冲区,因为上下文未请求kCGLPFADoubleBuffer;它会被注释。然后,问题出现在窗口或上下文中,或者两者都有。OpengGL部分很好。我在回答中添加了一些选项,说明如何调查此问题。这不应该是问题,因为我让它在b中工作在安装固定管道之前。