您的位置:首页 > 其它

给一个正方形添加纹理

2016-05-11 19:32 363 查看
顶点数据Vertex

----------------------------------------------------------

区分: 顶点 Vertex 与 顶点位置 Vertex Position 与 顶点属性 Vertex Attribute

---------------------------------------------------------

顶点数据是一个统称概念,可以包含多个部分,比如(顶点位置,顶点颜色,顶点对应的纹理坐标,等等)。

-----------------------------------------------------------

例如 一个顶点(Position, Color, TexCoord, ....)

float Position[3];//因为3D空间中一个坐标位置有三个分量

float Color[3]; //颜色具有三个分量/数据 R G B

float TexCoord[2];// 纹理坐标是二维空间,该变量一般用于对纹理图片的颜色采样使用

...//还可以定义其它数据,如顶点法线float Normal[3],表示该顶点处的法向量<<<<独有概念,数学中一个点没有法向量

///综上 Position Color TexCoord 可以构成一个顶点数据。。。还可以自定义其它顶点属性,并进行相应的描述。。

///一个顶点的内存大小为 sizeof(float) * 3 + sizeof(float) * 3 + sizeof(float) * 2

///顶点间的步长为?

-----------------------------------------------

float vertices[] = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0};

vertices 为顶点数据,有3个属性。

vertices 的属性为顶点的位置 (1.0f, 0.0f, 0.0f) 顶点的颜色(1.0f, 0.0f, 1.0f) 顶点的纹理坐标(1.0f, 1.0f)

vertices 共有1个顶点

vertices 要传送到vertex shader中具有开启3个位置,对应3个变量

vertices 的顶点数据可以来自文件、图片等。(高总总结的文字)

下面是实例:

////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

#include <string.h>

#include <math.h>

#include <GL/glew.h>

#include <GL/freeglut.h>

#include "ogldev_util.h"

#include "ogldev_glut_backend.h"

#include "ogldev_pipeline.h"

#include "ogldev_camera.h"

#include "ogldev_texture.h"

GLuint VBO;

const char* pVSFileName = "shader.vs";

const char* pFSFileName = "shader.fs";

GLuint gSampler;

Texture* pTexture = NULL;

struct Vertex

{

Vector3f m_pos;

Vector3f m_tex;

Vector2f m_tex1;

Vertex() {}

Vertex(Vector3f pos, Vector3f tex,Vector2f tex1)

{

m_pos = pos;

m_tex = tex;

m_tex1 = tex1;

}

};

static void RenderSceneCB()

{

glClear(GL_COLOR_BUFFER_BIT);

glEnableVertexAttribArray(0);

glEnableVertexAttribArray(1);

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)24);

pTexture->Bind(GL_TEXTURE0);

glDrawArrays(GL_QUADS, 0, 4);

glDisableVertexAttribArray(0);

glDisableVertexAttribArray(1);

glDisableVertexAttribArray(2);

glutSwapBuffers();

}

static void InitializeGlutCallbacks()

{

glutDisplayFunc(RenderSceneCB);

}

//正方形坐标,顶点颜色坐标,贴图

static void CreateVertexBuffer()

{

double n = 0.5;

Vertex Vertices[4] =

{

Vertex(Vector3f(-0.5f, 0.5f, 0.0f), Vector3f(1.0f, 1.0f, 0.0f), Vector2f(0.0f, 0.0f)),

Vertex(Vector3f(0.5f, 0.5f, 0.0f), Vector3f(0.5f, 0.5f, 1.0f), Vector2f(2.0f,0.0f)),

Vertex(Vector3f(0.5f, -0.5f, 0.0f), Vector3f(1.0f, 0.0f, 0.0f), Vector2f(2.0f, 1.0f)),

Vertex(Vector3f(-0.5f, -0.5f, 0.0f), Vector3f(0.0f, 1.0f, 0.0f), Vector2f(0.0f, 1.0f))

};

//写入句柄

glGenBuffers(1, &VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

}

static void AddShader(GLuint ShaderProgram, const char* pShaderText, GLenum ShaderType)

{

GLuint ShaderObj = glCreateShader(ShaderType);

if (ShaderObj == 0) {

fprintf(stderr, "Error creating shader type %d\n", ShaderType);

exit(0);

}

const GLchar* p[1];

p[0] = pShaderText;

GLint Lengths[1];

Lengths[0]= strlen(pShaderText);

glShaderSource(ShaderObj, 1, p, Lengths);

glCompileShader(ShaderObj);

GLint success;

glGetShaderiv(ShaderObj, GL_COMPILE_STATUS, &success);

if (!success) {

GLchar InfoLog[1024];

glGetShaderInfoLog(ShaderObj, 1024, NULL, InfoLog);

fprintf(stderr, "Error compiling shader type %d: '%s'\n", ShaderType, InfoLog);

exit(1);

}

glAttachShader(ShaderProgram, ShaderObj);

}

//创建一个shader程序对象来开始我们的着色器工程.

static void CompileShaders()

{

GLuint ShaderProgram = glCreateProgram();

if (ShaderProgram == 0) {

fprintf(stderr, "Error creating shader program\n");

exit(1);

}

string vs, fs;

if (!ReadFile(pVSFileName, vs)) {

exit(1);//异常退出

};

if (!ReadFile(pFSFileName, fs)) {

exit(1);//异常退出

};

AddShader(ShaderProgram, vs.c_str(), GL_VERTEX_SHADER);

AddShader(ShaderProgram, fs.c_str(), GL_FRAGMENT_SHADER);

GLint Success = 0;

GLchar ErrorLog[1024] = { 0 };

//链接操作

glLinkProgram(ShaderProgram);

glGetProgramiv(ShaderProgram, GL_LINK_STATUS, &Success);

if (Success == 0) {

glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);

fprintf(stderr, "Error linking shader program: '%s'\n", ErrorLog);

exit(1);

}//检查程序相关的错误

//管线状态程序是否能够成功执行

glValidateProgram(ShaderProgram);

glGetProgramiv(ShaderProgram, GL_VALIDATE_STATUS, &Success);

if (!Success) {

glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);

fprintf(stderr, "Invalid shader program: '%s'\n", ErrorLog);

exit(1);

}

gSampler = glGetUniformLocation(ShaderProgram, "gSampler");

assert(gSampler != 0xFFFFFFFF);

//将链接之后的 Shader 程序对象添加到渲染管线中

glUseProgram(ShaderProgram);

}

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

glutInitWindowSize(1024, 768);

glutInitWindowPosition(100, 100);

glutCreateWindow("Tutorial 04");

InitializeGlutCallbacks();

// Must be done after glut is initialized!

GLenum res = glewInit();

if (res != GLEW_OK) {

fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));

return 1;

}

printf("GL version: %s\n", glGetString(GL_VERSION));

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

CreateVertexBuffer();

CompileShaders();

//读入图片数据glGetUniformLocation()传入着色器

glUniform1i(gSampler, 0);

pTexture = new Texture(GL_TEXTURE_2D, "mn2.png");

if (!pTexture->Load()) {

return 1;

}

glutMainLoop();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: