• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

OpenGL这两个统一的sampler2Ds具有相同的图像

c/c++ 来源:user7147804 4次浏览

我无法通过统一的sampler2Ds发送两个纹理到我的片段着色器。我的片段着色器有两个制服,但看起来我的代码将同一图像发送给两个采样器。首先绑定的纹理似乎自动绑定到两个制服。OpenGL这两个统一的sampler2Ds具有相同的图像

完整C++代码如下:

#define GLEW_STATIC 
#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp> 
#include <glm/gtc/type_ptr.hpp> 
#include <SOIL/SOIL.h> 
#include <fstream> 
#include <iostream> 
#include <sstream> 
#include <string> 


int main(int argc, const char* argv[]) 
{ 
GLFWwindow* display; 
glfwInit(); 

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); 
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); 

display = glfwCreateWindow(1280, 720, "Game Engine", nullptr, nullptr); 
glfwMakeContextCurrent(display); 
glewExperimental = GL_TRUE; 
GLenum success = glewInit(); 

GLint height, width; 
glfwGetFramebufferSize(display, &width, &height); 
glViewport(0, 0, width, height); 
glEnable(GL_DEPTH_TEST); 

GLuint program; 
std::string vertexCode, fragmentCode; 
std::ifstream vShaderFile, fShaderFile; 

std::string vertexPath = "Basic.vert"; 
std::string fragmentPath = "Basic.frag"; 

vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); 
fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); 
try 
{ 
    vShaderFile.open(vertexPath); 
    fShaderFile.open(fragmentPath); 
    std::stringstream vShaderStream, fShaderStream; 

    vShaderStream << vShaderFile.rdbuf(); 
    fShaderStream << fShaderFile.rdbuf(); 

    vShaderFile.close(); 
    fShaderFile.close(); 

    vertexCode = vShaderStream.str(); 
    fragmentCode = fShaderStream.str(); 
} 
catch(std::ifstream::failure error) 
{ 
    std::cout << "Error: Shader file not successfully read." << std::endl; 
} 

GLuint vertex, fragment; 
GLchar infoLog[512]; 

const GLchar* vertShaderCode = vertexCode.c_str(); 
vertex = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertex, 1, &vertShaderCode, NULL); 
glCompileShader(vertex); 

const GLchar* fragShaderCode = fragmentCode.c_str(); 
fragment = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragment, 1, &fragShaderCode, NULL); 
glCompileShader(fragment); 

program = glCreateProgram(); 
glAttachShader(program, vertex); 
glAttachShader(program, fragment); 
glLinkProgram(program); 

glDeleteShader(vertex); 
glDeleteShader(fragment); 

GLfloat vertices[] = { 
    -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 
    0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 
    0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 
    0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 
    -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 
    -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 
}; 

GLuint VAO, VBO; 
glGenVertexArrays(1, &VAO); 
glGenBuffers(1, &VBO); 
glBindVertexArray(VAO); 
glBindBuffer(GL_ARRAY_BUFFER, VBO); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

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

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

GLuint texture0, texture1; 

glGenTextures(1, &texture0); 
glBindTexture(GL_TEXTURE_2D, texture0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
unsigned char* image = SOIL_load_image("container.jpg", 
    &width, &height, 0, SOIL_LOAD_RGB); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, 
    GL_RGB, GL_UNSIGNED_BYTE, image); 
glGenerateMipmap(GL_TEXTURE_2D); 
SOIL_free_image_data(image); 
GLint uniform = glGetUniformLocation(program, "texture0"); 
glUniform1i(uniform, 0); 

glGenTextures(1, &texture1); 
glBindTexture(GL_TEXTURE_2D, texture1); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
image = SOIL_load_image("awesomeface.png", 
    &width, &height, 0, SOIL_LOAD_RGB); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, 
    GL_RGB, GL_UNSIGNED_BYTE, image); 
glGenerateMipmap(GL_TEXTURE_2D); 
SOIL_free_image_data(image); 
uniform = glGetUniformLocation(program, "texture1"); 
glUniform1i(uniform, 1); 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texture0); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, texture1); 

while (!glfwWindowShouldClose(display)) 
{ 
    glClearColor(0.761f, 0.698f, 0.502f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glUseProgram(program); 

    glBindVertexArray(VAO); 
    glDrawArrays(GL_TRIANGLES, 0, 6); 

    glfwSwapBuffers(display); 
    glfwPollEvents(); 
} 

glDeleteVertexArrays(1, &VAO); 
glDeleteBuffers(1, &VBO); 

return EXIT_SUCCESS; 
} 

关联GLSL着色器文件是如下: 顶点着色器:

#version 400 core 
layout (location = 0) in vec3 position; 
layout (location = 1) in vec2 texCoord; 

out vec2 TexCoord; 


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

片段着色器:

#version 400 core 
in vec2 TexCoord; 

out vec4 fragColor; 

uniform sampler2D texture0; 
uniform sampler2D texture1; 


void main() 
{ 
vec4 color1 = texture(texture0, TexCoord); 
vec4 color2 = texture(texture1, TexCoord); 
fragColor = mix(color1, color2, 0.4f); 
} 

===========解决方案如下:

glUniform1i(uniform, 0); 

Thi s函数作用于当前正在使用的程序。在渲染循环之前,您不要调用glUseProgram。所以它应该给你一个GL_INVALID_OPERATION错误,因此什么都不做。

在设置统一值之前,您应该使用来自GL 4.1+(它接受其操作的程序)的glProgramUniform或调用glUseProgram


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)