2017-11-25 22 views
1

私はここで同様の記事を見つけましたが、何も私の問題を助けません。私はちょうど基本的なOpenGLを使用しており、テクスチャを適用して三角形を描画しようとしています。しかし何らかの理由で三角形は単色です。この色は、テクスチャの背景と同じ色になります。OpenGLのテクスチャを1つの色として描画します

これは私が

を描画しようとしていると私は、私はテクスチャを編集して実験してきたプログラム

enter image description here

を実行したときに、これは結果である質感です左下に青色(原点)があり、このように出てきました。

私の推測では、赤と青を補間して紫色にしています。しかし、なぜ私が望むようにテクスチャを描くのではなく、最初に色を補間するのか分かりません。シェーダ

auto vertString = getSource("test.vert"); 
auto vertSource = vertString.c_str(); 
GLint vertLength = vertString.length(); 

auto fragString= getSource("test.frag"); 
auto fragSource = fragString.c_str(); 
GLint fragLength = fragString.length(); 

auto vertShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertShader, 1, &vertSource, &vertLength); 

auto fragShader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragShader, 1, &fragSource, &fragLength); 

//compile shaders 
glCompileShader(vertShader); 
checkShaderCompilation(vertShader, "vertex shader"); 

glCompileShader(fragShader); 
checkShaderCompilation(fragShader, "fragment shader"); 

auto program = glCreateProgram(); 

glAttachShader(program, vertShader); 
glAttachShader(program, fragShader); 

glBindAttribLocation(program, 0, "i_position"); 
glBindAttribLocation(program, 1, "i_texCoord"); 

//link program 
glLinkProgram(program); 
checkProgramLinkage(program, "vertex shader", "fragment shader"); 

glDetachShader(program, vertShader); 
glDetachShader(program, fragShader); 

glDeleteShader(vertShader); 
glDeleteShader(fragShader); 

をロードメインループ

glClearColor(0, 0, 0, 1); 

glEnable(GL_BLEND); 
glEnable(GL_TEXTURE); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

前に物事を有効にする

はテクスチャ

のロード:

この

は、私のコードの関連部分のいくつかのこまごまとしています

頂点は構造

struct Vertex 
{ 
    Vector2 position; 
    Vector2 texCoord; 
}; 

頂点配列

Vertex data[] = { 
    -0.5, -0.5, 0, 0, 
    0.5, -0.5, 1, 0, 
    0.5, 0.5, 1, 1 
}; 

GLuint vertexBuffer = 0, vertexArray = 0; 

glGenBuffers(1, &vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*3, data, GL_STATIC_DRAW); 

glGenVertexArrays(1, &vertexArray); 
glBindVertexArray(vertexArray); 

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 2, GL_FLOAT, 0, sizeof(Vertex), (char*)offsetof(Vertex, position)); 

glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 2, GL_FLOAT, 0, sizeof(Vertex), (char*)offsetof(Vertex, texCoord)); 

を発生させ、結合/メインループ

glClear(GL_COLOR_BUFFER_BIT); 

//texture 
glBindTexture(GL_TEXTURE_2D, texture); 

//shader 
auto colorLoc = glGetUniformLocation(program, "u_color"); 
glUniform3f(colorLoc, 0, 0, 1); 

auto useTextureLoc = glGetUniformLocation(program, "u_usingTexture"); 
glUniform1i(useTextureLoc, 1); 

auto textureLoc = glGetUniformLocation(program, "u_sampler"); 
glUniform1i(textureLoc, 0); 

glUseProgram(program); 

//vertex array 
glBindVertexArray(vertexArray); 

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glDrawArrays(GL_TRIANGLES, 0, 3); 

SDL_GL_SwapWindow(window); 

ですべてを描画するには、これは私の頂点シェーダである

#version 420 

in vec2 i_position; 
in vec2 i_texCoord; 

out vec2 o_texCoord; 

void main() 
{ 
    o_texCoord=i_texCoord; 
    gl_Position=vec4(i_position, 0, 1); 
} 

と私のフラグメントシェーダ

私は文字通り数日間この問題を解決しようとしてきましたが、わかりません。テクスチャの代わりに1つの色でレンダリングする理由を誰かが理解できれば、非常に感謝しています。

答えて

2

あなたのtexcoordsを使用していない。

これは私の頂点シェーダ

[...] 
out vec2 o_texCoord; 

そして、私のフラグメントシェーダ

[...] 
in vec2 i_texCoord; 

あなたの頂点シェーダ出力の名前です一致する必要がありますあなたの葉のものシェイダー入力そうでないので、あなたのフラグメントシェーダは入力値を見て、は未定義です。仕様通りにです。

リンク中にエラーが発生しない唯一の理由は、条件付きでフラグメントシェーダーでi_texCoordを使用することです(「動的使用」)。フラグメントシェーダでi_texCoordを静的に使用すると、実際にリンクエラーが発生します。しかし、comipler /リンカはあなたが決してその変数にアクセスすることを排除することができないので、このコードは仕様に従って許可されており、コンパイルエラーにならないようにする必要があります。しかし、実際にそれらの値にアクセスすると、それらは未定義です。

+0

ああ私の神様、あなたはまさにそうです、ありがとう!私は頂点を知らなかったし、断片は今まで同じ名前でなければならなかった。 –

関連する問題