0

私は OpenGL を学んでいて、簡単なテクスチャリングをしようとしています。したがって、テクスチャ座標を属性として指定します。

頂点シェーダーで奇妙なエラーが発生しました:

#version 150

in vec2 position;
in vec3 color;
in vec2 texcoord;

out vec3 Color;
out vec2 Texcoord;

void main()
{
    Color = color;
    Texcoord = vec2 (1.0, 0.5); /* just for debugging hardcode texcords */
    gl_Position = vec4( position, 0.0, 1.0 );
}

シェーダーは正常にコンパイルされますが、シェーダーが属するプログラムをリンクしようとすると、glGetProgramInfoLog() ログに次のように表示されます。

エラー: コンパイルされた頂点シェーダーが壊れていました。

外すと

in vec2 texcoord;

エラーが消えます。属性にどのように名前を付けるかは問題ではありません。3 つ目を追加するとすぐに、このエラーが発生します。

コンパイル エラーはありません。このリンクエラーだけです。

OS X 10.8.3 で OpenGL 3.2 コア コンテキストを使用しています。GLEWを使用しています。

アップデート:

これでリンクできます:

#version 150

in vec2 position;
in vec3 color;
in vec2 texcoord;

out vec3 Color;
out vec2 Texcoord;

void main()
{
    Color = color;
    gl_Position = vec4( position, 0.0, 1.0 );
}

しかし、追加するとすぐに

Texcoord = texcoord;

メイン関数に対してシェーダーが破損します。私は絶望的です。これは何ですか?

4

1 に答える 1

2

上記のコメントで、コードを

const char* shaderSource = loadFile(path.c_str()).c_str();

string shaderString = loadFile(path.c_str());
const char* shaderSource = shaderString.c_str();

問題を修正しました。

std::string オブジェクトへの参照がないため、オブジェクトが破棄されています。これにより、c 文字列バッファーが破棄されます。読み込み時にそのバッファの内容がどうなるかは運次第です。

于 2014-03-14T07:53:27.977 に答える