使用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中工作在安装固定管道之前。