gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:38 26 4
gpt4 key购买 nike

我正在尝试在我的程序中使用基本着色器,我遇到了 a nice tutorial这会告诉你如何编写一个基本的着色器“util 类”,我想你会这样调用它?这应该允许我应用顶点和片段着色器...所以我将 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 函数?

最佳答案

您给出的错误行是编译器告诉您,它不知道 GL/gl.hGL/glew 中定义的 GLchar 类型。 h 在你的例子中,它也定义了它。但它似乎没有正确包含。<​​/p>

你的第一行应该是

#include <GL/glew.h>

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

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

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

关于c++ - 设置基本着色器程序 - GLchar 和 file_contents 未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8226171/

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