2017-08-22 10 views
2

をピックアップし、私は2つのテクスチャをミックス私のコードで、OpenGLは、常にここで最初のテクスチャ

main.cppにここ

#include <iostream> 

// GLEW 
#include <GL/glew.h> 

// GLFW 
#include <GLFW/glfw3.h> 


// Shader Class 
#include "Shader.h" 

// SOIL2 JSpartan 
#include "SOIL2.h" 

const int WIDTH=500, HEIGHT=600; 

int main() { 

    // Init GLFW 
    glfwInit(); 

    // Set all the required options for GLFW 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 

    // Create a GLFWwindow object that we can use for GLFW's functions 
    GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr); 

    int screenWidth, screenHeight; 
    glfwGetFramebufferSize(window, &screenWidth, &screenHeight); 

    if (nullptr == window) 
    { 
     std::cout << "Failed to create GLFW window" << std::endl; 
     glfwTerminate(); 

     return EXIT_FAILURE; 
    } 

    glfwMakeContextCurrent(window); 

    // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions 
    glewExperimental = GL_TRUE; 
    // Initialize GLEW to setup the OpenGL Function pointers 
    if (GLEW_OK != glewInit()) 
    { 
     std::cout << "Failed to initialize GLEW" << std::endl; 
     return EXIT_FAILURE; 
    } 

    // Define the viewport dimensions 
    glViewport(0, 0, screenWidth, screenHeight); 
    // enable alpha support 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 


    // load shaders 
    Shader *ourShader = new Shader("res/shaders/core.vs","res/shaders/core.fs"); 

    GLfloat vertices[] = { 
     1.0f, 1.0f, 0.0f,  1.0f, 0.0f, 0.0f,  1.0f, 1.0f, // top right corner 
     1.0f, -1.0f, 0.0f,  0.0f, 1.0f, 0.0f,  1.0f, 0.0f, // bottom right corner 
     -1.0f, -1.0f, 0.0f,  0.0f, 0.0f, 1.0f,  0.0f, 0.0f, // bottom left corner 
     -1.0f, 1.0f, 0.0f,  1.0f, 1.0f, 0.0f,  0.0f, 1.0f // top left corner 
    }; 

    GLuint indices[] = { 
     0, 1, 2, // trainagle 1 right sided 
     2, 3, 0 
    }; 

    GLuint VAO, VBO, EBO; 

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

    glGenBuffers(1, &VBO); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    glGenBuffers(1, &EBO); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 


    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid *) 0); 
    glEnableVertexAttribArray(0); 

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid *) (3 * sizeof(GLfloat))); 
    glEnableVertexAttribArray(1); 

    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid *) (6 * sizeof(GLfloat))); 
    glEnableVertexAttribArray(2); 


    // Load textures 
    GLuint textures[2]; 
    glGenTextures(2, textures); 

    int width, height; 
    unsigned char* image; 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, textures[0]); 
    image = SOIL_load_image("res/face1.jpg", &width, &height, 0, SOIL_LOAD_RGB); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
    SOIL_free_image_data(image); 
    glUniform1i(glGetUniformLocation(ourShader->Program, "face1"), 0); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glActiveTexture(GL_TEXTURE1); 
    glBindTexture(GL_TEXTURE_2D, textures[1]); 
    image = SOIL_load_image("res/face2.jpg", &width, &height, 0, SOIL_LOAD_RGB); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
    SOIL_free_image_data(image); 
    glUniform1i(glGetUniformLocation(ourShader->Program, "face2"), 1); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    //glBindVertexArray(0); 



    // Game loop 
    while (!glfwWindowShouldClose(window)) 
    { 
     // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions 
     glfwPollEvents(); 


     glClearColor(0.2f, 0.3f, 0.5f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT); 
     ourShader->Use(); 

     //glBindVertexArray(VAO); 

     glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 
     //glDrawArrays(GL_TRIANGLES, 0, 3); 


     // Swap the screen buffers 
     glfwSwapBuffers(window); 
    } 

} 

は、私の頂点シェーダです:

#version 330 core 

layout (location = 0) in vec3 position; 
layout (location = 1) in vec3 color; 
layout (location = 2) in vec2 texCoord; 


out vec3 ourColor; 
out vec2 TexCoord; 

void main() { 
    ourColor = color; 
    TexCoord = vec2(texCoord.x, 1-texCoord.y); 
    gl_Position = vec4(position.x, position.y, position.z, 1.0); 
} 

これはフラグメントシェーダです。

#version 330 core 
in vec3 ourColor; 
in vec2 TexCoord; 

out vec4 color; 
uniform sampler2D face1; 
uniform sampler2D face2; 


void main() { 
    vec4 colorFace1 = texture(face1, TexCoord); 
    vec4 colorFace2 = texture(face2, TexCoord); 

    color = colorFace2; //* vec4(ourColor, 1.0);;//vec4(ourColor, 1.0f); 
} 

今問題は、コードを実行するたびにコードが実行され、出力は常に「face1.jpg」です。私はmentioned hereのようなステップの指示に従いました。

上記のリンクでウェブサイトにアクセスした場合、プログラムの出力はこの記事に示すように2つの画像を混合する必要があります。

+0

はあなたが確認しているプログラムユニフォームをセットするときにアクティブになっていますか?その前に正しいプログラムで 'glUseProgram'を呼び出しましたか? – BDL

+0

また、[tag:opengl]または[tag:opengl-es]のいずれかを選択する必要があります。両方を持つことはできません。 – BDL

答えて

5

glUniformが現在のプログラムオブジェクトの一様変数の値を指定しているため、コードには指示の問題があります。

int texLocationFace1 = glGetUniformLocation(ourShader->Program, "face1"); 
int texLocationFace2 = glGetUniformLocation(ourShader->Program, "face2"); 

しかし、均一な変数の値を設定する:プログラムは(glLinkProgram)が正常に連結された後、

均一な場所はglGetUniformLocationによっていつでも取り出すことができ、そして後の使用のために格納されプログラムはアクティブなプログラム(glUseProgram)でなければなりません。注意してください、プログラムを選択するパラメータは、glUniformのsinularでありません。
あなたは

ourShader->Use(); 

前に制服の値を設定し、プログラムを使用する必要があります:あなたはglUniformを呼び出すため

glUniform1i(texLocationFace1, 0); 
glUniform1i(texLocationFace2, 1); 

注意、あなたは任意の前に、テクスチャサンプラの制服を設定することはありませんシェーダプログラムが使用されます。均一変数faceface 2はデフォルトで0で初期化されています。したがって、このテクスチャはテクスチャユニットGL_TEXTURE0にバインドされているため、出力は常に "face1.jpg"です。あなたが唯一のシェーダプログラムを使用して、あなたがそれを変更しないので

、それは使用プログラムとメインループの前に制服を設定するために十分なものである:

ourShader->Use(); 
glUniform1i(texLocationFace1, 0); 
glUniform1i(texLocationFace2, 1); 

while (!glfwWindowShouldClose(window)) 
{ 
    .... 
} 
+1

ああ、私は明らかなエラーのためにコードを精査し、それをうまくいかなかった。これだよ。私は彼がこの例の中でループの中で使う必要があるとは思わない。それを一度行うことで十分です。 – Robinson

1

フラグメントシェーダーには色が混ざっていません。 face1とface2の両方からテクスチャルックアップを作成していて、後者のみを返し、前者を破棄します。お試しください。フラグメントシェーダーで

color = 0.5 * (colorFace1 + colorFace2); 

をお試しください。

あなたが見ているものが本当にface1で、face2でない場合は、他の場所にも見つからなかったことが間違っています。

+0

彼の現在のコードで、彼はface2の色を取得すべきではありませんか?しかし、彼は顔の色を取得すると主張しています1。 – BDL

+0

はい、私の最後の文章を見てください。 :) –

+0

はい、私はface1を見ていてface2は見ていません。 –

関連する問題