给一个正方形添加纹理
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;
}
----------------------------------------------------------
区分: 顶点 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;
}
相关文章推荐
- 实时错误91,对象变量或with块变量未设置
- iOS run loop详解
- 序列帧动画.shader
- CSS布局的三种方式:
- Swift - 使用addSubview()方法将StoryBoard中的视图加载进来
- 作业5
- 深度基础学习:Decision Tree 代码实现
- iOS照相机获取到的图片自动旋转90度解决办法
- 剑指offer题解【链表中倒数第k个结点】
- map集合的4种遍历方法和List集合的2种遍历和迭代器Iterator的使用
- 文章标题
- java socket网络编程
- Spark-SparkSQL深入学习系列六(转自OopsOutOfMemory)
- hdu 4612 Warm up(边双连通分量+缩点+dfs)
- leetcode(6),Excel Sheet Column Title和Excel Sheet Column Number(python)
- AD维基
- Volley StringRequest和JSONObjectRequest使用几个细节
- 这是爱的等候
- 王学岗触摸事件解析
- elk的搜索常用 基于lucence