首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >glCreateShader返回0

glCreateShader返回0
EN

Stack Overflow用户
提问于 2011-08-14 02:58:55
回答 2查看 7.3K关注 0票数 2

我有一个使用cygwin和GCC的windows构建环境,并且链接到GLEE,GLUT和opengl32的库。这是一个Win32版本。

所有对glCreateShader的调用都返回0,但是我没有发现任何错误。以下是基于GLUT和GLSL的灯塔教程,因此GL操作的顺序应该是正确的。

下面是相关的代码..

代码语言:javascript
运行
复制
#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;

..。

代码语言:javascript
运行
复制
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.中定义。

代码语言:javascript
运行
复制
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++,请建议。

代码语言:javascript
运行
复制
UPDATE:

根据这里的反馈,我使用glewinfo实用程序检查了我的OpenGL支持,它报告说这个系统被限制到1.1。- https://docs.google.com/document/d/1LauILzvvxgsT3G2KdRXDTOG7163jpEuwtyno_Y2Ck78/edit?hl=en_US

例如:

代码语言:javascript
运行
复制
---------------------------
    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以上的版本?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-16 03:26:29

这个问题的解决方案在评论中提供了,我在这里突出显示它,以结束这个问题。

所需要的就是将驱动程序升级到支持我正在使用的扩展的版本。所以我安装了NVidia的OpenGL驱动程序,可以在这里获得- http://developer.nvidia.com/opengl-driver

我的系统的原始NVidia驱动程序似乎被破坏了,因此使用的是本机windows OpenGL驱动程序。这只支持OpenGL 1.1。但我错误地认为,基于我得到的一些糟糕的建议,GL_VERSION为1.1.0在Windows上是正常的。事实上,我能够毫无错误地编译和执行这段代码,这让我认为这些扩展是存在的。他们不是。

票数 4
EN

Stack Overflow用户

发布于 2014-11-06 05:01:53

我也遇到过同样的问题,但这是一个愚蠢的C++语言技巧:我的着色器是在一个全局/静态变量(这是一个使用程序着色器的包装类)中编译的,它是在拥有GL上下文之前初始化的。希望它能帮上忙。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7052624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档