rikilee_ouc 2016-12-27 13:45 采纳率: 0%
浏览 1274

OpenGL 纹理 程序能运行,但是没结果

#include
#include
#ifdef _DEBUG
#include
#endif
#include
#include
#include
#include "imageloader.h"

// program
static GLuint program, textureId;
// width and height of window
static GLint width, height;
// degree of rotation
GLfloat angle = 0.0f;

//----------------------------------------------------
//
// Shader Source
//
static const char* vShaderSource = "#version 450 core\n"
"layout (location = 0) in vec3 vpos;\n"
//"layout (location = 1) in vec4 vcolor;\n"
"layout (location = 1) in vec2 ptex;\n"
"layout (location = 2) uniform mat4 mvp;\n"
"out vec4 color;\n"
"out vec2 vtex;\n"
"void main()\n"
"{\n"
" gl_Position = mvp * vec4(vpos,1.0f);\n"
//" color = vcolor;\n"
" vtex = ptex;\n"
"}\n";

static const char* fShaderSource = "#version 450 core\n"
//"in vec4 color;\n"
"in vec2 vtex;\n"
"uniform sampler2D tex;\n"
"out vec4 fcolor;\n"
"void main()\n"
"{\n"
" fcolor = texture(tex, vtex);\n"
"}\n";

//-----------------------------------------------------------
//
// vertices (position and color)
//
static const struct
{
float x, y, z;
}vertices[6] = {
// front
{ -1.0f, 1.0f, 1.0f },
{ -1.0f, -1.0f, 1.0f },
{ 1.0f, -1.0f, 1.0f },
{ 1.0f, -1.0f, 1.0f },
{ 1.0f, 1.0f, 1.0f },
{ -1.0f, 1.0f, 1.0f }
};
static const struct {
float x, y;
} texv[6] = {
{0.0f,1.0f},
{0.0f,0.0f},
{1.0f,0.0f},
{1.0f,0.0f},
{1.0f,1.0f},
{0.0f,1.0f}
};
static GLuint vt;

void Init_shader()
{
program = glCreateProgram();

GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vshader, 1, &vShaderSource, NULL);
glCompileShader(vshader);

//------------------------------------------------------------------------------{
//check                                                                  
GLint compiled;
glGetShaderiv(vshader, GL_COMPILE_STATUS, &compiled);
if (!compiled) {

#ifdef _DEBUG
GLsizei len;
glGetShaderiv(vshader, GL_INFO_LOG_LENGTH, &len);

    GLchar* log = new GLchar[len + 1];
    glGetShaderInfoLog(vshader, len, &len, log);
    std::cerr << "1 Shader compilation failed: " << log << std::endl;
    delete[] log;

#endif
return;
}
//----------------------------------------------------------------------------}
glAttachShader(program, vshader);

GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fshader, 1, &fShaderSource, NULL);
glCompileShader(fshader);
//---------------------------------------------------------------------------{
// check
glGetShaderiv(fshader, GL_COMPILE_STATUS, &compiled);
if (!compiled) {

#ifdef _DEBUG
GLsizei len;
glGetShaderiv(fshader, GL_INFO_LOG_LENGTH, &len);

    GLchar* log = new GLchar[len + 1];
    glGetShaderInfoLog(fshader, len, &len, log);
    std::cerr << "1 Shader compilation failed: " << log << std::endl;
    delete[] log;

#endif
return;
}
//--------------------------------------------------------------------------}
glAttachShader(program, fshader);

glLinkProgram(program);
//--------------------------------------------------------------------------{
// check
GLint linked;
glGetProgramiv(program, GL_LINK_STATUS, &linked);
if (!linked)
{

#ifdef _DEBUG
GLsizei len;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);

    GLchar* log = new GLchar[len + 1];
    glGetProgramInfoLog(program, len, &len, log);
    std::cerr << "Shader linking failed: " << log << std::endl;
    delete[] log;

#endif
glDeleteShader(GL_VERTEX_SHADER);
glDeleteShader(GL_FRAGMENT_SHADER);

    return;
}
//----------------------------------------------------------------------------}

}

void Init_data()
{
glGenVertexArrays(1,&vt);
glBindVertexArray(vt);

GLuint vbuff;
glGenBuffers(1, &vbuff);
glBindBuffer(GL_ARRAY_BUFFER, vbuff);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 7, (void*)0);

Image* image = loadBMP("bird.bmp");
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width, image->height, 0, GL_RGB, GL_UNSIGNED_BYTE, image->pixels);
delete image;

GLuint tbuff;
glGenBuffers(1, &tbuff);
glBindBuffer(GL_ARRAY_BUFFER, tbuff);
glBufferData(GL_ARRAY_BUFFER, sizeof(texv), texv, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, (void*)0);

}

void Init_funcSet()
{
glViewport(0, 0, width, height);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glEnable(GL_LINE_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);

}

void display()
{
glm::mat4 Projection = glm::perspective(45.0f, (float)(width / height), 0.1f, 100.0f);
glm::mat4 View = glm::lookAt(
glm::vec3(4, 3, -3),
glm::vec3(0, 0, 0),
glm::vec3(0, 1, 0)
);
glm::mat4 Model = glm::mat4(1.0f);
glm::mat4 RotationMatrix = glm::eulerAngleY(angle);
glm::mat4 mvp = Projection * View * RotationMatrix * Model;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(program);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glUniformMatrix4fv(2, 1, GL_FALSE, &mvp[0][0]);
glBindVertexArray(vt);
glDrawArrays(GL_TRIANGLES, 0, 6);
glFlush();
glutSwapBuffers();
}

//------------------------------------
//
// Reshape window
//
void reshape(int x, int y)
{
glViewport(0, 0, x, y);
width = x;
height = y;
}

//---------------------------------------
//
// update function
//
void update(int value)
{
angle += 0.02f;
if (angle > 360) {
angle -= 360;
}
glutPostRedisplay();
glutTimerFunc(20, update, 0);
}

int main(int argc, char ** argv)
{

width = height = 500;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(width, height);
glutCreateWindow("OpenGL");

if (glewInit())
{

#ifdef _DEBUG
std::cerr << "Unable to initialize GLEW ... exiting" << std::endl;
#endif
exit(EXIT_FAILURE);
}

Init_shader();
Init_funcSet();
Init_data();

glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(20, update, 0);
glutMainLoop();
//return 0; // never reach

}


  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2016-12-31 02:20
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 thinkphp适配人大金仓问题
  • ¥20 Oracle替换.dbf文件后无法连接,如何解决?(相关搜索:数据库|死循环)
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义