gpt4 book ai didi

opengl - glCreateShader 返回 0

转载 作者:行者123 更新时间:2023-12-02 03:41:19 24 4
gpt4 key购买 nike

我有一个使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com