Настройка базовой шейдерной программы - GLchar и file_contents не определены? - PullRequest
2 голосов
/ 22 ноября 2011

Я пытаюсь поэкспериментировать с использованием базовых шейдеров в своей программе, я натолкнулся на хороший учебник , в котором рассказывается о написании базового шейдера "util class", я думаю, вы бы это назвали?Что должно позволить мне применить вершинный и фрагментный шейдер ... Так что я связал 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 Ответ

3 голосов
/ 22 ноября 2011

В строке ошибки вы указали, что компилятор сообщает вам, что он не знает о типе 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

...