1. 程式人生 > >給一個正方形新增紋理

給一個正方形新增紋理

頂點資料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  與   頂點位置 Vertex Position  與 頂點屬性  Vertex Attribute -

一個view新增旋轉動畫,並且停止後保持旋轉角度,恢復後可繼續旋轉

   RotateAnimation這個動畫類 animation.setFillAfter(true);方法是在動畫自動停止後保持原位,而手動停止呼叫clearAnimation()後旋轉的控制元件會變成最開始的位置,想到的解決方  法是讓動畫旋轉30度

一個Table新增合計行

public static void AppendSumaryRow(DataTable table){    if (table.Rows.Count > 0)    {        DataRow dr = table.NewRow();        for (int i = 0; i <

JavaScript中prototype(原型)字串物件新增一個toCharArray的方法,reverse(翻轉)的 方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http:/

一個控制元件新增一個旋轉動畫

// 均勻旋轉動畫 private RotateAnimation rotateAnimation; rotateAnimation = (RotateAnimation) AnimationUtils.loadAnimation(getContext(), R.anim.rotating

一個新工程專案新增Podfile檔案

給一個新工程專案新增Podfile檔案。 常用的快捷方法; 1,在終端使用命令列,cd+檔名 —> 進入檔案工程中。 2,終端命令,pod init, 建立一個podfile檔案。 3,完成上兩個步驟之後,可以看到 此時,該podfile檔案已經在工程中。 4,開啟podfile進

原有介面新增一個停止訓練功能

在介面增加一個“停止訓練”按鈕 <td class="center">   <a href='/trainlog/setlist?eq_id=${entity.setId}&eq_orgId=${entity.orgId}'>檢視日誌</a>   <

原生jsDOM元素新增一個或者多個類的方法總結

先看兩個例子: html: <div class="test" id="test"> 啦啦啦 </div> css: .test{ width: 100px; hei

一個正在執行的Docker容器動態新增Volume

之前有人問我Docker容器啟動之後還能否再掛載卷,考慮到mnt名稱空間的工作原理,我一開始認為這很難實現。不過現在Petazzoni通過使用nsenter和繫結掛載實現了這個需求,你可以在你的環境中測試下。 之前有人問我Docker容器啟動之後還能否再掛載卷,考慮mnt名

C#JSON物件新增一個鍵值對

直接看程式碼: /// <summary>新增一個屬性 /// /// </summary> /// <

用OpenGL快速圖形新增紋理含圓柱圓錐

這裡討論的是二維紋理 1.圖取影象資料 void readimage(char* filename, BYTE* imagedata)//所讀圖片均為24位bmp,且寬度補齊至四位元組邊界 { BITMAPFILEHEADER bf; //檔案頭 BITMAPINF

Android元件新增事件一個很好用的方法

在這裡想和大家分享一下很好用的新增事件方法,特別是在處理ListView裡的Item事件的時候,很方便。 首先,在XML里布局的時候,新增這樣一個屬性: android:onClick="CallOnclick",比如你要對Button新增事件,     <Butto

hdu 3183 A Magic Lamp(一個n位的數,從中刪去m個數字,使得剩下的數字組成的數最小(順序不能變),然後輸出)

urn scan eight sca query names efi family 題目 1.題目大意是,給你一個1000位的數,要你刪掉m個為,求結果最小數。 思路:在n個位裏面刪除m個位。也就是找出n-m個位組成最小數 所以在區間 [0, m]裏面找

HDU2256&&HDU4565:一個式子的求第n項的矩陣快速冪

升級版本 簡單 eof ems size lan blank 向下取整 c++ HDU2256 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2256 題意:求(sqrt(2)+sqrt(3))^2n%1024是多少。 這個題

7,裝飾者模式(Decorator Pattern)動態的一個對象添加一些額外的職責。就增加功能來說,此模式比生成子類更為靈活。繼承關系的一個替換方案。

做到 活性 splay .com 重新 裝飾 run play 情況 裝飾( Decorator )模式又叫做包裝模式。通過一種對客戶端透明的方式來擴展對象的功能,是繼承關系的一個替換方案。 裝飾模式就是把要添加的附加功能分別放在單獨的類中,並讓這個

LightOJ 1248 - Dice (III) 一個質地均勻的n的骰子, 求投擲出所有點數至少一次的期望次數。(概率)

pri std printf 有一個 return main tdi algorithm style 題意:http://www.lightoj.com/volume_showproblem.php?problem=1248   投擲出第一個未出現的點數的概率為n/n =

Codeforces Round #197 (Div. 2) A. Helpful Maths【字符串/一個連加計算式,只包含數字 1、2、3,要求重新排序,使得連加的數字從小到大】

asi man title problem beginning 排序 stand should cati A. Helpful Maths time limit per test 2 seconds memory limit per t

實現一個DIV加陰影效果!

red 技術分享 html pos cto posit ron nag borde <!DOCTYPE html><html><head><meta charset="utf-8"><title>

一個對象相同的屬性(不區分大小寫)賦值一個新對象

spa name OS null tty return 賦值 AR val 1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.Create

如何一個動態的網頁加個固定的底部(如:備案號)

網頁<html><head><title></title><meta charset="UTF-8"><style type="text/css">*{padding: 0;margin:0;lis