• <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| 色妞色综合久久夜夜| 久久国产精品99精品国产987| 久久久久国产一级毛片高清板| 久久精品国产日本波多野结衣| 88久久精品无码一区二区毛片| 亚洲精品美女久久777777| 狠狠色综合久久久久尤物| 亚洲精品美女久久777777| 无码精品久久一区二区三区| 97久久精品人妻人人搡人人玩| 久久综合色老色| 国产亚州精品女人久久久久久| 亚洲国产精品成人久久| 久久久这里有精品| 亚洲欧美精品一区久久中文字幕| 国产精品久久久久久福利69堂| 久久久久久久97| 人妻无码αv中文字幕久久琪琪布| 精品久久人人妻人人做精品| 久久精品天天中文字幕人妻| 久久精品国产99久久久古代 | 色婷婷久久综合中文久久蜜桃av| 久久国产视屏| 精品欧美一区二区三区久久久| 国产精品福利一区二区久久| 欧美一区二区三区久久综合| 国产精品一区二区久久精品涩爱 | 久久精品无码一区二区三区免费 | 国产精品久久久久久久久免费 | 国产午夜精品理论片久久影视| 97久久综合精品久久久综合| 久久亚洲私人国产精品| 伊人久久大香线蕉av不卡|