3

OpenGL で頂点シェーダーをコンパイルする際に問題が発生しています。私はかなり標準的な頂点シェーダーを持っています:

#version 330

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
out vec4 ex_Color;
void main(void)
{
gl_Position = in_Position;
ex_Color = in_Color;
}

私のシェーダー読み込み関数は次のようになります。

string temp = LoadFile(vShaderPath);
const char* vShaderString = temp.c_str();
const char* vShaderPathC = vShaderPath.c_str();
fprintf(stderr, "File: %s \nContents: %s\n", vShaderPathC, vShaderString);
temp = LoadFile(fShaderPath);
const char* fShaderString = temp.c_str();

vShaderHandle = glCreateShader(GL_VERTEX_SHADER);
fShaderHandle = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(vShaderHandle, 1, &vShaderString, NULL);
glShaderSource(fShaderHandle, 1, &fShaderString, NULL);

GLint compiled;

glCompileShader(vShaderHandle);
glCompileShader(fShaderHandle);

glGetShaderiv(vShaderHandle, GL_COMPILE_STATUS, &compiled);
if(compiled == false)
{
    fprintf(stderr, "ERROR: Vertex shader not compiled properly.\n");

    GLint blen = 0;
    GLsizei slen = 0;

    glGetShaderiv(vShaderHandle, GL_INFO_LOG_LENGTH , &blen);
    if (blen > 1)
    {
        GLchar* compiler_log = new GLchar[blen];
        glGetInfoLogARB(vShaderHandle, blen, &slen, compiler_log);
        fprintf(stderr, "compiler log:\n %s", compiler_log);
        delete [] compiler_log;
    }
}

しかし、プログラムを実行すると、次の出力が得られます。

INFO: OpenGL Version: 3.3.0 NVIDIA 310.19
File: vShader.v.glsl
Contents: #version 330

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
void main(void)
{
    gl_Position = in_Position;
    ex_Color = in_Color;
}

ERROR: Vertex shader not compiled properly.
compiler log:
  (0) : error C0000: syntax error, unexpected $end at token "<EOF>"

ロードファイルは次のように定義されています。

string ShaderEffect::LoadFile(string path)
{
    ifstream in(path.c_str(), ios::in);

    if(in.is_open())
    {

        string contents;
        in.seekg(0, ios::end);
        contents.resize(in.tellg());
        in.seekg(0, ios::beg);
        in.read(&contents[0], contents.size());
        in.close();
        return contents;
    }
    else
        throw "Problem reading file!";
}

文字列を次のようにハードコーディングしたため、glsl コード自体が問題ではないことはわかっています。

const char * testvShader = {
"#version 330\n"\
"layout(location=0) in vec4 in_Position;\n"\
"layout(location=1) in vec4 in_Color;\n"\
"out vec4 ex_Color;"
"void main()\n"\
"{\n"\
"    gl_Position = in_Position;\n"\
"    ex_Color = in_Color;\n"\
"}"};

&vShaderString を &testvShader に切り替えると、プログラムは正常に動作します。しかし、フラグメントシェーダーが同じ方法でロードされ、コンパイルして完全に正常に実行されるため、ロードがどのように問題になるかはわかりません。コンパイルする前にファイルをコンソールに出力すると、問題なく表示されます。私は知恵が尽きており、問題が何であるかを理解できません。

PSそれが重要な場合、私はFedoraで実行しています。

4

2 に答える 2

3

を呼び出しc_str()temp結果を変数に格納し、temp保存した の結果を変更して使用しますc_str()。文字列を変更すると c_str() の結果が無効になるため、これは機能しません。

于 2012-12-15T00:35:21.490 に答える
1

このコンパイラ エラーは通常、末尾のガベージが原因で発生します。最も簡単な解決策は、ソース文字列の正確な長さを OpenGL に伝えることです。

glShaderSource 呼び出しを次のように置き換えます

const char* vShaderString = temp.c_str();
int vertex_shader_string_length = temp.length();

/* ... */

const char* fShaderString = temp.c_str();
int fragment_shader_string_length = temp.length();

glShaderSource(vShaderHandle, 1, &vShaderString, &vertex_shader_string_length);
glShaderSource(fShaderHandle, 1, &fShaderString, &fragment_shader_string_length);
于 2012-12-15T00:07:17.060 に答える