私はここで同様の記事を見つけましたが、何も私の問題を助けません。私はちょうど基本的なOpenGLを使用しており、テクスチャを適用して三角形を描画しようとしています。しかし何らかの理由で三角形は単色です。この色は、テクスチャの背景と同じ色になります。OpenGLのテクスチャを1つの色として描画します
これは私が
を描画しようとしていると私は、私はテクスチャを編集して実験してきたプログラム
を実行したときに、これは結果である質感です左下に青色(原点)があり、このように出てきました。
私の推測では、赤と青を補間して紫色にしています。しかし、なぜ私が望むようにテクスチャを描くのではなく、最初に色を補間するのか分かりません。シェーダ
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つの色でレンダリングする理由を誰かが理解できれば、非常に感謝しています。
ああ私の神様、あなたはまさにそうです、ありがとう!私は頂点を知らなかったし、断片は今まで同じ名前でなければならなかった。 –