"glGenTextures" returns 使用 4.2 OpenGL 时出现 1282 错误
"glGenTextures" returns 1282 error when using 4.2 OpenGL
我正在使用默认函数 glGenTextures 创建 OpenGL 纹理。当 OpenGL 版本设置为 3.0 时一切正常,但是当我用 4.2 glGenTextures 覆盖它时开始抛出错误 #1282(无效操作)。我做错了什么?
这是我测试过的代码段:
#include "GL/freeglut.h"
#include "GL/gl.h"
#define MAJOR_GL_VERSION 3
#define MINOR_GL_VERSION 0
int w = 200;
int h = 200;
const char* title = "title";
int main(int argc, char const *argv[])
{
puts("Overriding default OpenGL version...");
glutInitContextVersion(MAJOR_GL_VERSION, MINOR_GL_VERSION);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA);
glutInitWindowSize(w, h);
glutCreateWindow(title);
printf("Using OpenGL Version: %s\n=========\n", (char*)glGetString(GL_VERSION));
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, h, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glEnable( GL_ALPHA_TEST );
glEnable( GL_BLEND );
GLenum error;
GLuint id = 0;
glGenTextures(1, &id);
if((error = glGetError()) != GL_NO_ERROR || id == 0)
{
printf("Gl error: %s (errno %i)\n", gluErrorString(error), error);
return 0;
}
while (1) { }
return 0;
}
错误可能不会发生在您预期的行中。 glGenTextures
之前的某些方法很可能是问题所在。这两行都没有
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, h, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glShadeModel(GL_SMOOTH);
在 OpenGL 核心配置文件中是允许的。配置文件是在 OpenGL 3.2 中引入的,因此在请求 3.0 上下文时,Core Profile 请求没有任何效果。但是对于 3.2+,您将获得一个删除了很多内容的核心配置文件。
您可以删除上面提到的行并将它们替换为与 Core-Profile 兼容的代码。或者您可以明确请求兼容性配置文件(glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE)
当您想坚持使用固定功能管道时。
我正在使用默认函数 glGenTextures 创建 OpenGL 纹理。当 OpenGL 版本设置为 3.0 时一切正常,但是当我用 4.2 glGenTextures 覆盖它时开始抛出错误 #1282(无效操作)。我做错了什么?
这是我测试过的代码段:
#include "GL/freeglut.h"
#include "GL/gl.h"
#define MAJOR_GL_VERSION 3
#define MINOR_GL_VERSION 0
int w = 200;
int h = 200;
const char* title = "title";
int main(int argc, char const *argv[])
{
puts("Overriding default OpenGL version...");
glutInitContextVersion(MAJOR_GL_VERSION, MINOR_GL_VERSION);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA);
glutInitWindowSize(w, h);
glutCreateWindow(title);
printf("Using OpenGL Version: %s\n=========\n", (char*)glGetString(GL_VERSION));
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, h, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glEnable( GL_ALPHA_TEST );
glEnable( GL_BLEND );
GLenum error;
GLuint id = 0;
glGenTextures(1, &id);
if((error = glGetError()) != GL_NO_ERROR || id == 0)
{
printf("Gl error: %s (errno %i)\n", gluErrorString(error), error);
return 0;
}
while (1) { }
return 0;
}
错误可能不会发生在您预期的行中。 glGenTextures
之前的某些方法很可能是问题所在。这两行都没有
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, h, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glShadeModel(GL_SMOOTH);
在 OpenGL 核心配置文件中是允许的。配置文件是在 OpenGL 3.2 中引入的,因此在请求 3.0 上下文时,Core Profile 请求没有任何效果。但是对于 3.2+,您将获得一个删除了很多内容的核心配置文件。
您可以删除上面提到的行并将它们替换为与 Core-Profile 兼容的代码。或者您可以明确请求兼容性配置文件(glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE)
当您想坚持使用固定功能管道时。