设置基本着色器程序 - GLchar 和 file_contents 未定义?

Posted

技术标签:

【中文标题】设置基本着色器程序 - GLchar 和 file_contents 未定义?【英文标题】:Setting up basic shader program - GLchar and file_contents undefined? 【发布时间】:2011-11-22 11:39:18 【问题描述】:

我正在尝试在我的程序中使用基本着色器,我遇到了a nice tutorial,它通过编写基本着色器“工具类”来告诉你我猜你会称之为?这应该允许我应用顶点和片段着色器......所以我将 glew 链接到我的项目(我还包括 glu、glut 和 glaux)并将以下内容插入到头文件中

#include "include\gl\glew.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

static struct 
    /* ... fields for buffer and texture objects */
    GLuint vertex_shader, fragment_shader, program;

    struct 
        GLint fade_factor;
        GLint textures[2];
     uniforms;

    struct 
        GLint position;
     attributes;

    GLfloat fade_factor;
 g_resources;

static GLuint make_shader(GLenum type, const char *filename)

    GLint length;
    char *source = file_content(filename, &length);
    GLuint shader;
    GLint shader_ok;

    if (!source)
        return 0;
    shader = glCreateShader(type);
    glShaderSource(shader, 1, (const GLchar**)&source, &length);
    free(source);
    glCompileShader(shader);
    glGetShaderiv(shader, GL_COMPILE_STATUS, &shader_ok);
    if (!shader_ok) 
        fprintf(stderr, "Failed to compile %s:\n", filename);
        show_info_log(shader, glGetShaderiv, glGetShaderInfoLog);
        glDeleteShader(shader);
        return 0;
    
    return shader;


static void show_info_log(
    GLuint object,
    PFNGLGETSHADERIVPROC glGet__iv,
    PFNGLGETSHADERINFOLOGPROC glGet__InfoLog)

    GLint log_length;
    char *log;

    glGet__iv(object, GL_INFO_LOG_LENGTH, &log_length);
    log = malloc(log_length);
    glGet__InfoLog(object, log_length, NULL, log);
    fprintf(stderr, "%s", log);
    free(log);


static GLuint make_program(GLuint vertex_shader, GLuint fragment_shader)

    GLint program_ok;

    GLuint program = glCreateProgram();
    glAttachShader(program, vertex_shader);
    glAttachShader(program, fragment_shader);
    glLinkProgram(program);
     glGetProgramiv(program, GL_LINK_STATUS, &program_ok);
    if (!program_ok) 
        fprintf(stderr, "Failed to link shader program:\n");
        show_info_log(program, glGetProgramiv, glGetProgramInfoLog);
        glDeleteProgram(program);
        return 0;
    
    return program;


static int make_resources(void)

    /* make buffers and textures ... */
    g_resources.vertex_shader = make_shader(
        GL_VERTEX_SHADER,
        "hello-gl.v.glsl"
    );
    if (g_resources.vertex_shader == 0)
        return 0;

    g_resources.fragment_shader = make_shader(
        GL_FRAGMENT_SHADER,
        "hello-gl.f.glsl"
    );
    if (g_resources.fragment_shader == 0)
        return 0;

    g_resources.program = make_program(
        g_resources.vertex_shader,
        g_resources.fragment_shader
    );
    if (g_resources.program == 0)
        return 0;
    g_resources.uniforms.fade_factor
        = glGetUniformLocation(g_resources.program, "fade_factor");
    g_resources.uniforms.textures[0]
        = glGetUniformLocation(g_resources.program, "textures[0]");
    g_resources.uniforms.textures[1]
        = glGetUniformLocation(g_resources.program, "textures[1]");

    g_resources.attributes.position
        = glGetAttribLocation(g_resources.program, "position");

    return 1;

但我的编译器抱怨以下问题:

9   IntelliSense: "GLchar" is not a type name   

    11  IntelliSense: a value of type "void *" cannot be assigned to an entity of type "char *" 

    7   IntelliSense: identifier "file_contents" is undefined   

    5   IntelliSense: identifier "GLchar" is undefined

我错过了什么吗?我在网上搜索了一下,好像GLchar和file_contents函数确实存在?

【问题讨论】:

【参考方案1】:

您给出的错误行是编译器告诉您,它不知道类型 GLchar,它在 GL/gl.h 中定义 - 或者在您的情况下是 GL/glew.h,它也定义了它。但它似乎没有正确包含。

你的第一行应该是

#include <GL/glew.h>

即uppercae GL,一个正斜杠(反斜杠是 Microsoaft 的附加项,但也可以接受正斜杠),以及尖括号中的整个内容,正如您希望从标准包含中包含的那样。

接下来你不应该链接到glaux。那个太过时了,已经有毒了。

如果您想要一个工作的 OpenGL 着色器示例程序,我在 https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/minimal_glsl 准备了一个

【讨论】:

以上是关于设置基本着色器程序 - GLchar 和 file_contents 未定义?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL学习整理------着色器

Android 安装包优化Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )

在 PyQt 中编译着色器

OpenGL 程序着色器链接错误

UnityShader之固定管线着色器

OpenGLES3.0创建和编译着色器相关语法