- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 cygwin 和 GCC 的 Windows 构建环境,并且正在链接到 GLEE、GLUT 和 opengl32 的库。这是 Win32 版本。
对 glCreateShader 的所有调用都返回 0,但我没有发现任何错误。以下是基于Lighthouse的GLUT和GLSL教程,所以GL操作的顺序应该是正确的。
这是相关代码..
#define WIN32
#include <stdio.h>
#include <GL/GLee.h>
#include <GL/glut.h>
#include "SampleUtils.h"
#include "LineShaders.h"
GLint lineVertexHandle = 0;
unsigned int lineShaderProgramID;
...
int main(int argc, char **argv) {
// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("Lighthouse3D Tutorials");
// register callbacks
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);
glutIdleFunc(renderScene);
// initialize the shaders
init();
// enter GLUT event processing cycle
glutMainLoop();
return 0;
}
void init() {
glClearColor( 0.0, 0.0, 0.0, 1.0 ); /* Set the clear color */
lineShaderProgramID = SampleUtils::createProgramFromBuffer(lineMeshVertexShader,lineFragmentShader);
lineVertexHandle = glGetAttribLocation(lineShaderProgramID,"vertexPosition");
}
SampleUtils 是一个实用程序类,具有以下用于着色器处理的方法。着色器 lineMeshVertexShader 和 lineFragmentShader 在 LineShaders.h 中定义。
unsigned int SampleUtils::createProgramFromBuffer(const char* vertexShaderBuffer, const char* fragmentShaderBuffer) {
checkGlError("cPFB");
// scroll down for initShader() - we never get past this point.
GLuint vertexShader = initShader(GL_VERTEX_SHADER, vertexShaderBuffer);
if (!vertexShader)
return 0;
GLuint fragmentShader = initShader(GL_FRAGMENT_SHADER,
fragmentShaderBuffer);
if (!fragmentShader)
return 0;
GLuint program = glCreateProgram();
if (program)
{
glAttachShader(program, vertexShader);
checkGlError("glAttachShader");
glAttachShader(program, fragmentShader);
checkGlError("glAttachShader");
glLinkProgram(program);
GLint linkStatus = GL_FALSE;
glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
if (linkStatus != GL_TRUE)
{
GLint bufLength = 0;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
if (bufLength)
{
char* buf = (char*) malloc(bufLength);
if (buf)
{
glGetProgramInfoLog(program, bufLength, NULL, buf);
LOG("Could not link program: %s", buf);
free(buf);
}
}
glDeleteProgram(program);
program = 0;
}
}
return program;
}
unsigned int
SampleUtils::initShader(unsigned int shaderType, const char* source)
{
checkGlError("initShader");
//GLuint shader = glCreateShader((GLenum)shaderType);
/* trying explicit enum, just in case - shader is still always 0 */
GLuint shader = glCreateShader(GL_VERTEX_SHADER);
LOG("SHADER %i", shader);
if (shader)
{
glShaderSource(shader, 1, &source, NULL);
glCompileShader(shader);
GLint compiled = 0;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
if (!compiled)
{
GLint infoLen = 0;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen)
{
char* buf = (char*) malloc(infoLen);
if (buf)
{
glGetShaderInfoLog(shader, infoLen, NULL, buf);
LOG("Could not compile shader %d: %s",
shaderType, buf);
free(buf);
}
glDeleteShader(shader);
shader = 0;
}
}
}
return shader;
}
void SampleUtils::checkGlError(const char* operation) {
for (GLint error = glGetError(); error; error = glGetError())
LOG("after %s() glError (0x%x)", operation, error);
}
我想知道调用 glCreateShader 时上下文是否未完全初始化。但我也尝试在回调中调用 init() ,但没有效果。我对这个问题的搜索得到了构建一个已知良好示例的建议,以确认 glCreateShader 的可用性 - 如果有人有 C++ 的,请建议。
UPDATE:
根据此处的反馈,我使用 glewinfo 实用程序检查了我的 OpenGL 支持,并报告该系统仅限于 1.1。 -https://docs.google.com/document/d/1LauILzvvxgsT3G2KdRXDTOG7163jpEuwtyno_Y2Ck78/edit?hl=en_US
例如
---------------------------
GLEW Extension Info
---------------------------
GLEW version 1.6.0
Reporting capabilities of pixelformat 2
Running on a GDI Generic from Microsoft Corporation
OpenGL version 1.1.0 is supported
GL_VERSION_1_1: OK
---------------
GL_VERSION_1_2: MISSING
---------------
etc.
奇怪的是,使用 GLEE,我能够编译这些扩展,尽管它们显然不起作用。我检查了 gl.h 和 glext.h 头文件,它们是最新的 - 扩展名在那里。那么 Windows 上如何处理这个问题呢?如何设置和链接您的环境,以便可以使用 cygwin 和 Eclipse 进行 1.1 以上版本的开发?
最佳答案
评论中提供了这个问题的解决方案,我在这里强调它是为了结束这个问题。
所需要做的就是将驱动程序升级到支持我正在使用的扩展的版本。所以我安装了NVidia的OpenGL驱动程序,可以在这里获取 - http://developer.nvidia.com/opengl-driver
我的系统的原始 NVidia 驱动程序似乎已被破坏,因此可以使用 native Windows OpenGL 驱动程序。仅支持 OpenGL 1.1。但我错误地认为 1.1.0 的 GL_VERSION 在 Windows 上是正常的 - 基于我得到的一些糟糕的建议。事实上,我能够毫无错误地编译和执行这段代码,这让我假设扩展是存在的。他们不是。
关于opengl - glCreateShader 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7052624/
当我尝试使用 glCreateShader 创建着色器并运行我的程序时,我刚刚创建的窗口变为白色并给出错误: OpenGl.exe 中的 0x03D312F0 (atioglxx.dll) 引发异常:
为什么会出现这些错误? error: 'GL_VERTEX_SHADER' was not declared in this scope error: 'glCreateShader' was not
我应该有最新版本的 Glew 和 Glut,所以这应该不是问题。一切都应该链接起来,我正在使用 MS visual studio 2010。我的程序可以编译,但是当我到达 glCreateShader
我有一个使用 cygwin 和 GCC 的 Windows 构建环境,并且正在链接到 GLEE、GLUT 和 opengl32 的库。这是 Win32 版本。 对 glCreateShader 的所有
背景: 我的 c++/OpenGL3.1/GLSL/Qt 程序中有一个 Shader 类。我的程序使用多个基于不同 GLSL 源文件的着色器。 我的应用程序可以运行许多基于 QGLWidget 实现的
我在 OpenGL 中有一个项目,我正在尝试加载着色器。为此,我使用 GLuint shader=glCreateShader(shaderType);。问题是,当它尝试运行这一行时,我得到了 EXC
我遇到了 glCreateShaders 的问题。它总是返回 0。我将 Glew 与 SDL 结合使用,每当我运行该程序时,它都会显示: 0(1) : error C0000: syntax erro
我遇到了一个非常奇怪的 OpenGL 错误,其中调用 glCreateShader工作了几次,然后稍后我尝试调用它,但它失败了,返回 0。调用 glGetError紧接着也返回0,表示没有错误。环顾四
我正在使用 glew、glut 和 GLM 编写 C++ 程序。当我像这样创建着色器时: GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER
我有一些代码,我直接按照教程生成三角形。作者在 Windows 中编写他的代码,但他说这也可以在 OSX 中完成。我能够让程序编译,但它在遇到 glCreateShader 时抛出异常。我到处都看过,
我正在开发一个 OpenGL 程序来测试着色器并尝试编译它们。但是,对 glCreateShader() 的调用(以及其他着色器调用,如 glDeleteShader)会出现以下错误: (此错误来自
目前正在尝试让我的 C++ 源代码在 iOS 上运行。它在 Android 上的 OpenGLES 2.0 中运行,我已经完成了编译的所有内容,但在编译着色器时遇到了问题。由于某种原因 glCreat
我正在尝试学习如何编写 OpenGL 着色器。为什么这段代码在我的机器上运行时会段错误? (我使用的是 Ubuntu 10.04,我将其命名为 shader.cpp。) #include #incl
我在 android 上创建着色器程序时遇到了一个非常困难的问题。当我分别调用 glCreateShader 或 glCreateProgram 时,它们总是返回 0。 我已经介绍了有关故障排除的所有
我正在尝试使用 C++ 和 SDL 2 在 OpenGL ES 2.x 中渲染一个简单的三角形。但是 glCreateShader 和 glCreatProgram 返回零。下面是我正在使用的代码 #
我正在关注“OpenGL ES 2 for Android_快速入门指南”,并创建了使用 opengl 构建简单矩形表所需的一切。但是,当我运行应用程序时,我得到 glCreateShader 返回
我是一名优秀的程序员,十分优秀!