Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL纹理不渲染_C++_Opengl_Glfw - Fatal编程技术网

C++ OpenGL纹理不渲染

C++ OpenGL纹理不渲染,c++,opengl,glfw,C++,Opengl,Glfw,我目前正在尝试学习OpenGL。我已成功地将彩虹三角形渲染到屏幕上,并已成功地在屏幕上移动它们。 但是,我似乎无法正确地将纹理渲染为两个三角形 每当我运行这个程序时,我都会看到一个黑屏,没有任何渲染。我已经检查过了,并且图像文件确实位于正确的目录中(否则它不会运行!) 定义机顶盒映像的实现 #包括 #包括 #包括 #包括 int main() { //初始化glfw 如果(!glfwInit()) { fprintf(stderr,“错误:无法启动GLFW3。\n”); 返回1; } //创建渲

我目前正在尝试学习OpenGL。我已成功地将彩虹三角形渲染到屏幕上,并已成功地在屏幕上移动它们。 但是,我似乎无法正确地将纹理渲染为两个三角形

每当我运行这个程序时,我都会看到一个黑屏,没有任何渲染。我已经检查过了,并且图像文件确实位于正确的目录中(否则它不会运行!)

定义机顶盒映像的实现
#包括
#包括
#包括
#包括
int main()
{
//初始化glfw
如果(!glfwInit())
{
fprintf(stderr,“错误:无法启动GLFW3。\n”);
返回1;
}
//创建渲染上下文
GLFWwindow*window=glfwCreateWindow(480600,“Hello渲染”,
nullptr,nullptr);
如果(!窗口)
{
fprintf(stderr,“错误:无法使用创建呈现上下文”
“GLFW3。\n”);
返回1;
}
glfwMakeContextCurrent(窗口);
//启动GLEW
glewExperimental=GL_TRUE;
GLenum err=glewInit();
如果(错误!=GLEW_OK)
{
//问题:glewInit失败了,有严重问题。

std::cout首先,在编译和链接着色器时,应该检索错误消息:

GLint status = GL_TRUE;
char error_msg[1024];
GLsizei read;

GLuint vsp = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vsp, 1, &vertShader,  nullptr);
glCompileShader(vsp);
glGetShaderiv( vsp, GL_COMPILE_STATUS, &status );
if ( status != GL_TRUE )
{
    glGetShaderInfoLog( vsp, 1024, &read, error_msg );
    std::cout << "compile error:" << std::endl << error_msg << std::endl;
}

GLuint fsp = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fsp, 1, &fragShader, nullptr);
glCompileShader(fsp);
glGetShaderiv( fsp, GL_COMPILE_STATUS, &status );
if ( status != GL_TRUE )
{
    glGetShaderInfoLog( fsp, 1024, &read, error_msg );
    std::cout << "compile error:" << std::endl << error_msg << std::endl;
}

GLuint shader_program = glCreateProgram();
glAttachShader(shader_program, fsp);
glAttachShader(shader_program, vsp);
glLinkProgram(shader_program);
glGetProgramiv( shader_program, GL_LINK_STATUS, &status );
if ( status != GL_TRUE )
{
    glGetProgramInfoLog( shader_program, 1024, &read, error_msg );
    std::cout << "compile error:" << std::endl << error_msg << std::endl;
}
最后的代码如下所示:

const char* vertShader =
    "#version 330 core\n"
    "layout(location = 0) in vec3 vertexPosition_modelspace;"
    "layout(location = 1) in vec2 vt;"
    "out vec2 texture_coordinates;"
    "void main() {"
    "   texture_coordinates = vt;"
    "   gl_Position.xyz = vertexPosition_modelspace;"
    "   gl_Position.w = 1.0;"
    "}";

const char* fragShader =
    "#version 330 core\n"
    "uniform sampler2D basic_texture;"
    "out vec4 frag_color;"
    "in vec2 texture_coordinates;"
    "void main() {"
    "   vec4 texel = texture(basic_texture, texture_coordinates);"
    "   frag_color = texel;"
    "}";

当然,您必须为顶点属性提供顶点数据
vert\u modelspace

GLfloat texcoords[] = {
    0.0f, 1.0f,
    0.0f, 0.0f,
    1.0f, 0.0f,
    1.0f, 0.0f,
    1.0f, 1.0f,
    0.0f, 1.0f
};

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

GLuint vert_vbo;
glGenBuffers(1, &vert_vbo);
glBindBuffer(GL_ARRAY_BUFFER, vert_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof( vertex ), vertex, GL_STATIC_DRAW);

GLuint vt_vbo;
glGenBuffers(1, &vt_vbo);
glBindBuffer(GL_ARRAY_BUFFER, vt_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof( texcoords ), texcoords, GL_STATIC_DRAW);

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vert_vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vt_vbo);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(1);

最后,当纹理绑定到时,您应该将纹理单位的索引设置为纹理采样器统一变量
基本纹理

int texture_unit_index = 0;
GLuint tex = 0;
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0 + texture_unit_index );
glBindTexture(GL_TEXTURE_2D, tex);

.....

// to do after    glLinkProgram(shader_program);
int tex_sampler_loc = glGetUniformLocation( shader_program, "basic_texture" );

.....

// to do after    glUseProgram(shader_program);
glUniform1i( tex_sampler_loc, texture_unit_index );  

我建议您使用glGetError进行一些错误检查,并检查GLSL程序链接的状态。您可以像电路一样拆分它。为什么不将任何顶点位置数据绑定到属性位置
0
中的
vertex\u modelspace
?见鬼,您甚至从未启用attrib
0
。您的顶点位置在哪里数据?为什么不将纹理对象绑定到
basic\u纹理
sampler?
GLfloat texcoords[] = {
    0.0f, 1.0f,
    0.0f, 0.0f,
    1.0f, 0.0f,
    1.0f, 0.0f,
    1.0f, 1.0f,
    0.0f, 1.0f
};

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

GLuint vert_vbo;
glGenBuffers(1, &vert_vbo);
glBindBuffer(GL_ARRAY_BUFFER, vert_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof( vertex ), vertex, GL_STATIC_DRAW);

GLuint vt_vbo;
glGenBuffers(1, &vt_vbo);
glBindBuffer(GL_ARRAY_BUFFER, vt_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof( texcoords ), texcoords, GL_STATIC_DRAW);

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vert_vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vt_vbo);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(1);
int texture_unit_index = 0;
GLuint tex = 0;
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0 + texture_unit_index );
glBindTexture(GL_TEXTURE_2D, tex);

.....

// to do after    glLinkProgram(shader_program);
int tex_sampler_loc = glGetUniformLocation( shader_program, "basic_texture" );

.....

// to do after    glUseProgram(shader_program);
glUniform1i( tex_sampler_loc, texture_unit_index );