0

私はシェーダーに基づく単純なゲームに取り組んでおり、頂点シェーダー ファイルが大きくなるにつれて、そのサイズは 512 バイトに達し、C++ で読み込めなくなりました。一般的な問題ではないと思いますが、私はそれは、opengl の制限によるものではなく、私のカスタム シェーダー ローダーによるものだと思います。これが私の単純な頂点シェーダーのコードです (デカルト座標を球座標にマップすることになっています。そのサイズは 583 バイトです):

#version 330 core

uniform mat4 projection;
uniform mat4 camera;

layout (location=0) in vec3 vertex;
layout (location=1) in vec4 color;

in mat4 object;

out vec4 vColor;

void main()
{
  float x=sqrt(max(1.0-0.5*pow(vertex.y,2)-0.5*pow(vertex.z,2)+pow(vertex.y*vertex.z,2)/3.0,0.0));
  float y=sqrt(max(1.0-0.5*pow(vertex.x,2)-0.5*pow(vertex.z,2)+pow(vertex.x*vertex.z,2)/3.0,0.0));
  float z=sqrt(max(1.0-0.5*pow(vertex.x,2)-0.5*pow(vertex.y,2)+pow(vertex.x*vertex.y,2)/3.0,0.0));
  gl_Position=projection*camera*object*vec4(x,y,z,1.0); 
  vColor=color;
} 

そして、ローダーのコード:

GLuint vs;
vs=glCreateShader(GL_VERTEX_SHADER);
std::ifstream vertexShaderStream(_vsPath);
vertexShaderStream.seekg(0,std::ios::end);
unsigned int vsSourceLen=(unsigned int)vertexShaderStream.tellg();
vertexShaderStream.seekg(0,std::ios::beg);
char vertexShaderSource[vsSourceLen];
vertexShaderStream.read(vertexShaderSource,vsSourceLen);
vertexShaderStream.close();

const char *vsConstSource(vertexShaderSource);
glShaderSource(vs,1,&vsConstSource,NULL);
glCompileShader(vs);
int status;
glGetShaderiv(vs,GL_COMPILE_STATUS,&status);
if(!status)
{
    char log[256];
    glGetShaderInfoLog(vs,sizeof log,NULL,log);
    std::cout << log << std::endl;
    return -1;
}

サイズを 512bytes(2^9...) 以下 (511 以下) にするとうまくいきます。私はGLFW3を使ってopenGLをロードしています。そのような問題を見たことがありますか?

4

2 に答える 2

0

ifstream コンストラクターの 2 番目のパラメーターとして std::ifstream::binary を追加すると、問題が解決しました。デフォルトでファイルをテキスト ファイルとして扱う ifstream が、ファイルの長さが 512 バイトに達すると行末のカウントを停止し、実際のサイズに一致するようにランダムなバイトを追加する理由が正確にはわかりません。いずれにせよ、ifstream を使用することは、ファイルをロードするための最良の方法ではありませんが、シェーダーを扱うだけであれば、これで問題ないと思います (適切な「ios::binary」フラグを使用)。

于 2018-02-12T20:38:53.980 に答える