• <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
            久久久久黑人强伦姧人妻| AA级片免费看视频久久| 久久久精品波多野结衣| 99久久国产主播综合精品| 久久精品国产72国产精福利| 伊人 久久 精品| 亚洲国产精品久久久久婷婷老年 | 性欧美大战久久久久久久| 国产精品久久新婚兰兰| 999久久久无码国产精品| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久丫精品国产亚洲av| 国产视频久久| 久久久久久人妻无码| 欧美性大战久久久久久| 天天久久狠狠色综合| 午夜精品久久久久久毛片| 韩国三级中文字幕hd久久精品| 亚洲va久久久噜噜噜久久| 久久久久久一区国产精品| 久久精品一区二区| 久久天天躁狠狠躁夜夜网站| 人妻丰满?V无码久久不卡| 美女写真久久影院| 日产精品久久久久久久| 99久久综合国产精品免费| 久久久久无码精品国产app| 久久久91精品国产一区二区三区| 国产精品久久久久久久人人看 | 2022年国产精品久久久久 | 日韩久久无码免费毛片软件| 一本一道久久精品综合| 欧美一区二区精品久久| 国产精品久久久久…| 日韩精品久久久久久| 伊人久久综在合线亚洲2019 | 久久人爽人人爽人人片AV| 日日躁夜夜躁狠狠久久AV| 人妻无码久久一区二区三区免费| 亚洲AV无码一区东京热久久| 性欧美丰满熟妇XXXX性久久久|