• <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) 閱讀(622) 評論(0)  編輯 收藏 引用 所屬分類: Graphics
            99久久精品国产麻豆| 国产激情久久久久影院老熟女免费| 久久播电影网| 欧美日韩精品久久免费| 亚洲精品无码久久久久久| 久久水蜜桃亚洲av无码精品麻豆| 色综合久久综合中文综合网| 美女写真久久影院| 狠狠色丁香婷婷久久综合五月| 亚洲国产精品无码久久久不卡 | 91秦先生久久久久久久| 久久天天日天天操综合伊人av| 伊人久久精品无码av一区| 婷婷久久综合九色综合98| 亚洲人AV永久一区二区三区久久| 欧美一区二区三区久久综 | 久久毛片一区二区| 久久香蕉国产线看观看99| 精品伊人久久大线蕉色首页| 国产精品一区二区久久精品无码| 一本一本久久aa综合精品 | 日韩欧美亚洲综合久久影院d3| 欧美激情一区二区久久久| 国产精品九九久久精品女同亚洲欧美日韩综合区| 久久久久久无码国产精品中文字幕 | 亚洲AV日韩精品久久久久久久| 久久国产精品免费一区二区三区| 精品久久久久久久无码 | 亚洲国产精品婷婷久久| 久久久久亚洲av无码专区| 伊人久久大香线焦AV综合影院| 亚洲国产一成久久精品国产成人综合 | 一本久久a久久精品vr综合| 香港aa三级久久三级老师2021国产三级精品三级在 | 办公室久久精品| 四虎国产精品免费久久5151| 久久精品99久久香蕉国产色戒 | 久久久久av无码免费网| 人妻精品久久久久中文字幕69 | 久久精品国产黑森林| 久久福利片|