• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            黎明的剔透里伸出了你沁清的曖昧

            Graphics|EngineDev|GameDev|2D&3D Art

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              60 隨筆 :: 1 文章 :: 18 評論 :: 0 Trackbacks
            iPhone2
            最近版本的OpenGL更新以后,所有的固定流水線的功能全部加入到shader里面計算。
            兼容模式:最早版本的opengl繪制模式,支持glBegin/glEnd/glVertexPointer/glColorPointer等函數,也支持可編程管線,無顯卡要求。
            核心模式:現代3D編程模式,較新,不支持glBegin/glEnd/glVertexPointer/glColorPointer等函數,僅支持可編程管線。
            兼容模式Shader 和核心模式的Shader不兼容
            1.Shader:
            //VertexShader:
            1#version 330 core
            2
            3// Input vertex data, different for all executions of this shader.
            4layout(location = 0) in vec3 vertexPosition_modelspace;
            5
            6void main(){
            7    gl_Position.xyz = vertexPosition_modelspace;
            8}

            9
            10

            //FragmentShader:
            1#version 330 core
            2
            3// Ouput data
            4out vec3 color;
            5
            6void main(){
            7    // Output color = red
            8    color = vec3(1,0,0);
            9}
             
            2.Shader:Data can be passed from a vertex shader to a fragment shader, using output variables in the vertex shader and corresponding input variables in the fragment shader
            //VertexShader:
            1#version 330
            2
            3layout (location = 0) in vec4 position;
            4layout (location = 1) in vec4 color;
            5
            6smooth out vec4 theColor;
            7
            8void main(){
            9     gl_Position=position;
            10     theColor=color;
            11}

            //FragmentShader:
            1#version 330
            2
            3smooth in vec4 theColor;
            4out vec4 outputColor;
            5
            6void main(){
            7     outputColor=theColor;
            8}

            9
            10
            渲染:
            1void myDispaly(){
            2    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            3    glClear(GL_COLOR_BUFFER_BIT);
            4
            5    GLuint programID = LoadShaders( "vertpositionColor.vert", "fragmentpc.frag" );
            6   
            7    GLuint vertexbuffer;
            8    glGenBuffers(1, &vertexbuffer);
            9    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);   
            10    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
            11
            12    glUseProgram(programID);
            13    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
            14
            15    glEnableVertexAttribArray(0);
            16    glEnableVertexAttribArray(1);
            17  
            18    glVertexAttribPointer(0, 4, GL_FLOAT,   GL_FALSE, 0, (void*)0 );      
            19    glVertexAttribPointer(1, 4, GL_FLOAT,   GL_FALSE, 0, (void*)48 );      
            20 
            21    glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle
            22
            23    glDisableVertexAttribArray(0);
            24    glDisableVertexAttribArray(1);
            25  
            26    glutSwapBuffers();
            27    glUseProgram(0);
            28    glDeleteBuffers(1, &vertexbuffer);
            29}

            30

            3.Shader:移動
            如果不用內置函數來操作,那么可以用shader來實現,首先要計算出物體移動的x y z坐標,然后通過vertex shader來傳遞:
            //vertex shader
            1#version 330 core
            2
            3layout (location = 0) in vec4 position;
            4
            5uniform vec2 offset;
            6
            7void main(){
            8     vec4 totaloffset=vec4(offset.x,offset.y,0,0);
            9     gl_Position=position+totaloffset;
            10}
            uniform變量操作:
            1offsetLocation=glGetUniformLocation(programID,"offset");

            1 glUniform2f(offsetLocation,fXOffset,fYOffset);
             
            4.Shader:透視投影
            //vertex shader
            1#version 330 core
            2
            3layout (location = 0) in vec4 position;
            4layout (location = 1) in vec4 Color;
            5
            6smooth out vec4 theColor;
            7
            8uniform vec2 offset;
            9uniform float zNear;
            10uniform float zFar;
            11uniform float frustumScale;
            12
            13void main(){
            14     vec4 cameraPos=position+vec4(offset.x, offset.y, 0, 0);
            15     vec4 clipPos;
            16
            17     clipPos.xy=cameraPos.xy*frustumScale;
            18
            19     clipPos.z=cameraPos.z*(zNear + zFar)/(zNear - zFar);
            20     clipPos.z+=2*zNear*zFar/(zNear - zFar);
            21 
            22     clipPos.w = -cameraPos.z;
            23    
            24     gl_Position=clipPos;
            25     theColor=Color;
            26
            27}
            5.Shader 透視投影版本1
            //vertex shader

            1#version 330
            2
            3layout(location = 0) in vec4 position;
            4layout(location = 1) in vec4 color;
            5
            6smooth out vec4 theColor;
            7
            8uniform vec2 offset;
            9uniform mat4 perspectiveMatrix;
            10
            11void main()
            12{
            13    vec4 cameraPos = position + vec4(offset.x, offset.y, 0.0, 0.0);
            14   
            15    gl_Position = perspectiveMatrix * cameraPos;
            16    theColor = color;
            17}
            變量傳值:
            1offsetUniform = glGetUniformLocation(theProgram, "offset");
            2
            3perspectiveMatrixUnif = glGetUniformLocation(theProgram, "perspectiveMatrix");
            4
            5float fFrustumScale = 1.0f; float fzNear = 0.5f; float fzFar = 3.0f;
            6
            7float theMatrix[16];
            8memset(theMatrix, 0, sizeof(float) * 16);
            9
            10theMatrix[0] = fFrustumScale;
            11theMatrix[5] = fFrustumScale;
            12theMatrix[10] = (fzFar + fzNear) / (fzNear - fzFar);
            13theMatrix[14] = (2 * fzFar * fzNear) / (fzNear - fzFar);
            14theMatrix[11] = -1.0f;
            15
            16glUseProgram(theProgram);
            17glUniformMatrix4fv(perspectiveMatrixUnif, 1, GL_FALSE, theMatrix);
            18glUseProgram(0);
            posted on 2012-02-21 17:41 情絕格調(fresmaster) 閱讀(640) 評論(0)  編輯 收藏 引用 所屬分類: Graphics
            欧美日韩中文字幕久久伊人| 亚洲精品无码久久久久去q| 99久久综合狠狠综合久久| 久久精品无码免费不卡| 久久久久久综合网天天| 国内精品久久久久久99蜜桃| 国产精品熟女福利久久AV| 亚洲女久久久噜噜噜熟女| 99久久成人18免费网站| 色诱久久久久综合网ywww| 超级碰久久免费公开视频| 亚洲va中文字幕无码久久不卡| 精品久久久久久无码中文野结衣| 久久精品青青草原伊人| 免费精品久久久久久中文字幕 | 99久久成人国产精品免费| 久久一区二区三区免费| 免费国产99久久久香蕉| 久久综合久久自在自线精品自 | 天天躁日日躁狠狠久久| 久久人人爽人人爽人人片AV麻豆| 狠狠狠色丁香婷婷综合久久五月| 亚洲va久久久噜噜噜久久狠狠| 久久国产精品久久精品国产| 久久人人爽人人爽人人片av高请 | 免费国产99久久久香蕉| 69国产成人综合久久精品| 日韩精品久久久久久久电影蜜臀| 亚洲欧美一区二区三区久久| 亚洲国产精品成人久久蜜臀 | 久久亚洲中文字幕精品一区| 久久久久18| 久久人人爽人爽人人爽av| 久久久综合香蕉尹人综合网| 久久久久一本毛久久久| 久久久久久久国产免费看| 久久www免费人成精品香蕉| 久久精品无码一区二区三区免费| 久久不见久久见免费影院www日本| 亚洲国产成人久久精品影视| 丰满少妇人妻久久久久久4|