OpenGL需要一个“const char”,但我必须从文件中读取它

问题描述 投票:0回答:1

我正在创建一个 C 标头来从文件加载我的着色器,而不是我之前的做法,如下所示:

const char *vertexShaderSource = "#version 330 core\n"
    "layout (location = 0) in vec3 aPos;\n"
    "void main()\n"
    "{\n"
    "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
    "}\0";

这样,我只需将着色器设置为

const
就可以了。但现在我想让它从一个单独的文件中读取,所以我创建了这个标题:

#define ASSERT(x, str) if (!(x)) {printf(str); exit(1);}

typedef unsigned int uint;
typedef int32_t i32;

uint shader_create_program(char vertex_path[], char fragment_path[]) { 
  // Vertex shader
  FILE* file = fopen(vertex_path, "r");
  i32 success;

  fseek(file, 0, SEEK_END);
  int size = ftell(file) + 1;

  char vertex_shader_source[size];
  fread(vertex_path, sizeof(char), size, file);
  vertex_shader_source[size] = '\0';
  fclose(file);

  uint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
  glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
  glCompileShader(vertex_shader);

  glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
  ASSERT(success, "Error compiling vertex shader");

  // Fragment shader
  file = fopen(vertex_path, "r");

  fseek(file, 0, SEEK_END);
  size = ftell(file) + 1;

  char fragment_shader_source[size];
  fread(fragment_shader_source, sizeof(char), size, file);
  fragment_shader_source[size] = '\0';
  fclose(file);

  uint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
  glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
  glCompileShader(fragment_shader);

  glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
  ASSERT(success, "Error compiling fragment shader");

  // Create shader program
  uint shader_program = glCreateProgram();
  glAttachShader(shader_program, vertex_shader);
  glAttachShader(shader_program, fragment_shader);
  glLinkProgram(shader_program);
  glDeleteShader(vertex_shader);
  glDeleteShader(fragment_shader);

  glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
  ASSERT(success, "Error linking shaders");

  glUseProgram(shader_program);

  return shader_program;
}

这给了我错误,因为

glShaderSource
第三个参数预计是
const char

我尝试将其设置为常量,但显然,在这种情况下不能这样,因为我必须操纵它。

问题可以在这个片段中找到:

  char vertex_shader_source[size]; // Initialize the source here
  fread(vertex_path, sizeof(char), size, file); // I have to read the file into the buffer
  vertex_shader_source[size] = '\0'; // And also add the end char
  fclose(file);

  uint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
  glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); 
  // Then, here it was expecting for a constant value

如果需要我的着色器代码:(vertex-shader.glsl)

# version 330 core

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aCol;

out     vec4 _color;

uniform vec4 uniform_color;

void main() 
  gl_Position = vec4(aPos, 1);
  _color = vec4(aCol, 1);
}

错误信息:

expected ‘const GLchar * const*’ {aka ‘const char * const*’} but argument is of type ‘char (*)[size]’

c opengl types
1个回答
1
投票

我无法谈论语义,因为我不使用 OpenGL,但要获得所需的类型,您可以使用

& (const char *) { vertex_shader_source }
作为参数。这将创建一个指向
vertex_shader_source
的第一个元素的复合文字,然后获取其地址。

© www.soinside.com 2019 - 2024. All rights reserved.