Macos OpenGL 3.2不能在mac os x上使用GLFW,无法绘制任何内容
我正在使用GLFW和GLEW建立一个OpenGL3.2Xcode项目。我已经将GLFW include路径添加到头路径中,并将libglfw.a添加到项目中。我还添加了cocoa和OpenGL框架。然后我尝试使用以下示例代码: main.cpp:Macos OpenGL 3.2不能在mac os x上使用GLFW,无法绘制任何内容,macos,opengl,glfw,Macos,Opengl,Glfw,我正在使用GLFW和GLEW建立一个OpenGL3.2Xcode项目。我已经将GLFW include路径添加到头路径中,并将libglfw.a添加到项目中。我还添加了cocoa和OpenGL框架。然后我尝试使用以下示例代码: main.cpp: #include <stdio.h> #include <string.h> #include <GL/glew.h> #include <GL/glfw.h> #include "math3d.h"
#include <stdio.h>
#include <string.h>
#include <GL/glew.h>
#include <GL/glfw.h>
#include "math3d.h"
GLuint VBO;
static const char* pVS = " \n\
#version 150 \n\
\n\
layout (location = 0) in vec3 Position; \n\
\n\
void main() \n\
{ \n\
gl_Position = vec4(0.5 * Position.x, 0.5 * Position.y, Position.z, 1.0); \n\
}";
static const char* pFS = " \n\
#version 150 \n\
\n\
out vec4 FragColor; \n\
\n\
void main() \n\
{ \n\
FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n\
}";
static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glfwSwapBuffers();
}
static void CreateVertexBuffer()
{
Vector3f Vertices[3];
Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);
Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}
static void AddShader(GLuint ShaderProgram, const char* pShaderText, GLenum ShaderType)
{
GLuint ShaderObj = glCreateShader(ShaderType);
if (ShaderObj == 0) {
fprintf(stderr, "Error creating shader type %d\n", ShaderType);
return ;
}
const GLchar* p[1];
p[0] = pShaderText;
GLint Lengths[1];
Lengths[0]= strlen(pShaderText);
glShaderSource(ShaderObj, 1, p, Lengths);
glCompileShader(ShaderObj);
GLint success;
glGetShaderiv(ShaderObj, GL_COMPILE_STATUS, &success);
if (!success) {
GLchar InfoLog[1024];
glGetShaderInfoLog(ShaderObj, 1024, NULL, InfoLog);
fprintf(stderr, "Error compiling shader type %d: '%s'\n", ShaderType, InfoLog);
return;
}
glAttachShader(ShaderProgram, ShaderObj);
}
static void CompileShaders()
{
GLuint ShaderProgram = glCreateProgram();
if (ShaderProgram == 0) {
fprintf(stderr, "Error creating shader program\n");
return;
}
AddShader(ShaderProgram, pVS, GL_VERTEX_SHADER);
AddShader(ShaderProgram, pFS, GL_FRAGMENT_SHADER);
GLint Success = 0;
GLchar ErrorLog[1024] = { 0 };
glLinkProgram(ShaderProgram);
glGetProgramiv(ShaderProgram, GL_LINK_STATUS, &Success);
if (Success == 0) {
glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);
fprintf(stderr, "Error linking shader program: '%s'\n", ErrorLog);
return;
}
glValidateProgram(ShaderProgram);
glGetProgramiv(ShaderProgram, GL_VALIDATE_STATUS, &Success);
if (!Success) {
glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);
fprintf(stderr, "Invalid shader program: '%s'\n", ErrorLog);
return;
}
glUseProgram(ShaderProgram);
}
int main(int argc, char** argv)
{
glfwInit();
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
glfwOpenWindow(600, 600, 0, 0, 0, 0, 0, 0, GLFW_WINDOW);
GLenum err = glewInit();
if (GLEW_OK != err)
{
/* Problem: glewInit failed, something is seriously wrong. */
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
}
CreateVertexBuffer();
CompileShaders();
glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
while (1)
{
RenderScene();
}
return 0;
}
但是什么也没画,我只有一扇黄色的窗户。知道为什么会这样吗?我正在使用安装了osx lion的mac book pro一年左右的版本作为初学者,您可以尝试使用glGetError进行错误检查吗?好的,在glewInit调用之后,以及在CreateVertexBuffer、CompileShader和RenderScene之后,我得到了GL_INVALID_ENUM错误。我还没有确切地跟踪函数中哪些函数调用会导致错误,我认为任何OpenGL扩展函数调用都会导致错误。glewInit导致GL_INVALID_枚举,但它不返回错误,这是一种隔阂。我读到glewInit在opengl 3.2+上下文中生成GL_INVALID_枚举,并且在调用它之前需要指定glewExperimental=true,但我已经尝试过这样做,并且错误一直存在。我已经看到,在指定glewExperimental=true之后,我仍然得到GL_INVALID_枚举,但我不再在CreateVertexBuffer和CompileShader上得到错误,而是在GlenableVertexAttributeArray上得到GL_INVALID_操作,glDrawArrays和glDisableVertexAttribArrayYou确定该错误直接发生在enablevertexattrib之后?医生说只有在glBegin和glEnd之间才能发生这种情况,我在任何地方都看不到。文档可能不准确,但只是想确认一下。
#ifndef GLFWTest_math3d_h
#define GLFWTest_math3d_h
struct Vector3f
{
float x;
float y;
float z;
Vector3f()
{
}
Vector3f(float _x, float _y, float _z)
{
x = _x;
y = _y;
z = _z;
}
};
#endif