C++ Mac OS OpenGLView中红皮书中的第一个OpenGL程序
我想做的是在NSOpenGLView中运行红皮书(triangles.cpp)中的第一个OpenGL程序,但我的应用程序只将屏幕清除为黑色,并且不绘制所需的三角形(即使着色器已成功编译) (一个旁注:如果我使用glBegin()和glEnd(),我可以在屏幕上画图,但如果我使用glDrawArrays(),屏幕上就不会画任何东西) 这是我的密码:C++ Mac OS OpenGLView中红皮书中的第一个OpenGL程序,c++,objective-c,macos,cocoa,opengl,C++,Objective C,Macos,Cocoa,Opengl,我想做的是在NSOpenGLView中运行红皮书(triangles.cpp)中的第一个OpenGL程序,但我的应用程序只将屏幕清除为黑色,并且不绘制所需的三角形(即使着色器已成功编译) (一个旁注:如果我使用glBegin()和glEnd(),我可以在屏幕上画图,但如果我使用glDrawArrays(),屏幕上就不会画任何东西) 这是我的密码: #import "GLView.h" #include <OpenGL/gl3.h> #include <vector> #i
#import "GLView.h"
#include <OpenGL/gl3.h>
#include <vector>
#include <iostream>
@implementation GLView
static GLuint shaderProgram; // The shader program
static GLuint vPosition; // vPosition is a vertex shader input variable
static GLuint vao1; // Vertex Array Object
static GLuint vbo1; // Vertex Buffer Object
const GLuint num_verts = 6; // The number of vertices to draw
// The vertex data that will be drawn
GLfloat vertices[num_verts][2] = {
{ -0.90, -0.90 },
{ 0.85, -0.90},
{-0.90, 0.85},
{0.90,-0.85},
{0.90,0.90},
{-0.85, 0.90}
};
- (id)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
// 1. Make an OpenGL 4.1 context
NSOpenGLPixelFormatAttribute attrs[] =
{
NSOpenGLPFADoubleBuffer,
NSOpenGLPFADepthSize, 24,
// Must specify the 4.1 Core Profile to use OpenGL 4.1
NSOpenGLPFAOpenGLProfile,
NSOpenGLProfileVersion4_1Core,
0
};
NSOpenGLPixelFormat *pf = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
if (!pf)
{
NSLog(@"No OpenGL pixel format");
}
NSOpenGLContext* context = [[NSOpenGLContext alloc] initWithFormat:pf shareContext: nil] ;
[context makeCurrentContext];
// 2. Compiling the shaders
GLuint vs;
GLuint fs;
// Vertex Shader Source
const char *vss=
"#version 410\n"
"in vec4 vPosition;"
"void main(void) {"
"gl_Position = vPosition;"
"}";
// Fragment Shader Source
const char *fss=
"#version 410\n"
"out vec4 fColor;"
"void main(void) {"
"fColor = vec4(1.0,0.0,0.0,1.0);"
"}";
vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vss, NULL);
glCompileShader(vs);
// Error handling if shader was not compiled successfully
GLint isCompiled;
glGetShaderiv(vs, GL_COMPILE_STATUS, &isCompiled);
if(isCompiled == GL_FALSE)
{
GLint maxLength = 0;
glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &maxLength);
std::vector<GLchar> infoLog(maxLength);
glGetShaderInfoLog(vs, maxLength, &maxLength, &infoLog[0]);
//We don't need the shader anymore.
glDeleteShader(vs);
// Printing the error to console
for (int i = 0; i < infoLog.size(); i++)
putchar(infoLog[i]);
putchar('\n');
}
fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fss, NULL);
glCompileShader(fs);
// Error handling if shader was not compiled successfully
glGetShaderiv(fs, GL_COMPILE_STATUS, &isCompiled);
if(isCompiled == GL_FALSE)
{
GLint maxLength = 0;
glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &maxLength);
std::vector<GLchar> infoLog(maxLength);
glGetShaderInfoLog(fs, maxLength, &maxLength, &infoLog[0]);
//We don't need the shader anymore.
glDeleteShader(fs);
// Printing the error to console
for (int i = 0; i < infoLog.size(); i++)
putchar(infoLog[i]);
putchar('\n');
}
// 3. Attach the shaders
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vs);
glAttachShader(shaderProgram, fs);
glLinkProgram(shaderProgram);
// Error handling if program wasn't linked successfully
GLint isLinked;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, (int *)&isLinked);
if(isLinked == GL_FALSE)
{
GLint maxLength = 0;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &maxLength);
std::vector<GLchar> infoLog(maxLength);
glGetProgramInfoLog(shaderProgram, maxLength, &maxLength, &infoLog[0]);
// Printing the error to console
for (int i = 0; i < infoLog.size(); i++)
putchar(infoLog[i]);
putchar('\n');
}
vPosition = glGetAttribLocation(shaderProgram, "vPosition");
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE,
0, 0);
glEnableVertexAttribArray(vPosition);
glUseProgram(shaderProgram);
// 4. Creating the vertex data
glGenVertexArrays(1, &vao1);
glBindVertexArray(vao1);
glGenBuffers(1, &vbo1);
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vao1);
glDrawArrays(GL_TRIANGLES, 0, num_verts);
glFlush();
}
@end
#导入“GLView.h”
#包括
#包括
#包括
@实现视图
静态GLuint着色器程序;//着色器程序
静态胶合位置;//vPosition是顶点着色器输入变量
静态胶合vao1;//顶点数组对象
静态GLuint vbo1;//顶点缓存数组
const GLuint num_verts=6;//要绘制的顶点数
//将绘制的顶点数据
GLfloat顶点[num_verts][2]={
{ -0.90, -0.90 },
{ 0.85, -0.90},
{-0.90, 0.85},
{0.90,-0.85},
{0.90,0.90},
{-0.85, 0.90}
};
-(id)initWithCoder:(NSCoder*)编码器
{
self=[super initWithCoder:coder];
//1.创建OpenGL 4.1上下文
NSOpenGLPixelFormatAttribute属性属性[]=
{
NSOPENGLPFADOUBLEBUFER,
NSOpenGLPFADepthSize,24岁,
//必须指定4.1核心配置文件才能使用OpenGL 4.1
NSOpenGLPFAOpenGLProfile,
NSOpenGLProfileVersion4\u 1核心,
0
};
NSOpenGLPixelFormat*pf=[[NSOpenGLPixelFormat alloc]initWithAttributes:attrs];
如果(!pf)
{
NSLog(@“无OpenGL像素格式”);
}
NSOpenGLContext*context=[[NSOpenGLContext alloc]initWithFormat:pf shareContext:nil];
[上下文makeCurrentContext];
//2.编译着色器
GLuint vs;
胶合fs;
//顶点着色器源
常量字符*vss=
“#版本410\n”
“在vec4位置;”
“无效主(无效){”
“gl_位置=V位置;”
"}";
//片段着色器源
常量字符*fss=
“#版本410\n”
“输出矢量4颜色;”
“无效主(无效){”
“fColor=vec4(1.0,0.0,0.0,1.0);”
"}";
vs=glCreateShader(GL_顶点_着色器);
glShaderSource(vs,1,&vss,NULL);
glCompileShader(vs);
//如果着色器未成功编译,则处理错误
闪闪发光;
glGetShaderiv(vs、GLU编译状态和isCompiled);
如果(isCompiled==GL_FALSE)
{
闪烁最大长度=0;
glGetShaderiv(vs、GL\u INFO\u LOG\u LENGTH和maxLength);
std::向量信息日志(maxLength);
glGetShaderInfoLog(vs,maxLength,&maxLength,&infoLog[0]);
//我们不再需要着色器了。
glDeleteShader(vs);
//将错误打印到控制台
对于(int i=0;i
你能告诉我:
我是否正确创建OpenGL 4.1上下文(即NSOpenGLContext对象)
我是否正确编译/加载着色器
我是否正确创建了顶点数组对象和顶点缓冲区对象?我使用了Apple的GLEssentials示例中的代码,使其正常工作:
在编写了一些设置NSOpenGLView的代码(包括将NSOpenGLView将运行的OpenGL版本设置为4.1)之后,红皮书中的triangles.cpp示例在NSOpenGLView中运行得非常好。您是否尝试过在OpenGL调用旁边放置glGetError以跟踪任何返回错误的函数?