GPU & OpenGL相关 & 状态机 2022-06-15

2022-06-19  本文已影响0人  SMSM

渲染分离线渲染(离线烘焙) 和 实时渲染。 实时渲染的技术实现分 普通渲染 和 光线追踪算法渲染
https://www.zhihu.com/question/346575626

GPU

OpenGL相关

  1. 现代计算机图形学基础二
    https://zhuanlan.zhihu.com/p/449575856 差积 和 点积

  2. OpenGL ES 3.0 Pipeline Map对应的介绍
    https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview

  3. 渲染管线
    https://alaingalvan.gitbook.io/a-trip-through-the-graphics-pipeline/

  4. 光栅化阶段是把顶点数据离散化到像素的过程 ,通过varying传递的UV 或者 Color会被按照顶点比例做差值,差值的长度和顶点一致,传递到Fragment。
    https://webglfundamentals.org/webgl/lessons/zh_cn/webgl-how-it-works.html

  1. 工作流程。先定义buffer并填充数据,真正绘制时,绑定到对应的shader的handle上并指定数据读取格式。最后draw指令。https://webglfundamentals.org/webgl/lessons/zh_cn/webgl-drawing-multiple-things.html

  2. 关于纹理坐标的顺序问题,定义顶点顺序最好也是从左下角开始,这样和纹理坐标顺序是一致的。不需要做特别的旋转处理。纹理原点、图片读取的顺序 。

  3. MVP实现一个相机视角的3D场景 https://webglfundamentals.org/webgl/lessons/zh_cn/webgl-3d-camera.html

  4. Attributes 属性 (从缓冲中获取的数据)

  5. Uniforms 全局变量 (在一次绘制中对所有顶点保持一致值)

  6. Textures 纹理 (从像素或纹理元素中获取的数据)

  7. 看着一篇就够了 https://blog.csdn.net/ShareUs/article/details/80007236
    图形渲染管线,把一堆顶点数据,经过一个管道内一系列操作,把3D的绘制呈现到2维buffer的过程。

gl.drawArrays 或 gl.drawElements

Early Fragment Test

https://www.khronos.org/opengl/wiki/Early_Fragment_Test
https://www.khronos.org/opengl/wiki/Per-Sample_Processing#Pixel_ownership_test

默认的FBO就是0
Because the Default Framebuffer is owned by a resource external to OpenGL,

正确的渲染一个3D物体要经过的配置,https://webglfundamentals.org/webgl/lessons/zh_cn/webgl-3d-orthographic.html

gl.enable(gl.CULL_FACE)
gl.enable(gl.DEPTH_TEST);

先绘制正面再会是底面。要设置面剔除否则会存在视觉错误,然后还要开启depth_test
设置面剔除并且保证正面三角形顶点逆时针反面顶点顺序顺时针的方式,如果要让一个面正反有不同的颜色,就可以对一个面按照顺时针逆时针各绘制一遍。
深度buffer

状态机

https://webglfundamentals.org/webgl/lessons/resources/webgl-state-diagram.html

glGenTextures
gl.activeTexture(gl.TEXTURE0 + 0);
gl.bindTexture(gl.TEXTURE_2D, someTexture);

c->textures.active = texture - GL_TEXTURE0;
bindTextureTmu(c, c->textures.active, texture, tex);
texParameterx    EGLTextureObject* textureObject = c->textures.tmu[c->textures.active].texture;

内部维护了 c->textures.active

struct ogles_context_t {
context_t rasterizer;
array_machine_t arrays attribute((aligned(32)));
texture_state_t textures;
transform_state_t transforms;
vertex_cache_t vc;
prims_t prims;
culling_t cull;
lighting_t lighting;
user_clip_planes_t clipPlanes;
compute_iterators_t lerp attribute((aligned(32)));
vertex_t current;
vec4_t currentColorClamped;
vec3_t currentNormal;
viewport_t viewport;
point_size_t point;
line_width_t line;
polygon_offset_t polygonOffset;
fog_t fog;
uint32_t perspective : 1;
uint32_t transformTextures : 1;
EGLSurfaceManager* surfaceManager;
EGLBufferObjectManager* bufferObjectManager;

GLenum                  error;

static inline ogles_context_t* get() {
    return getGlThreadSpecific();
}

};

在GLSL中为什么变量的前缀都是 a_, u_ 或 v_ ?

那只是一个命名约定,不是强制要求的。 但是对我来说可以轻松通过名字知道值从哪里来,a_ 代表属性,值从缓冲中提供; u_ 代表全局变量,直接对着色器设置;v_ 代表可变量,是从顶点着色器的顶点中插值来出来的。 查看WebGL工作原理获取更多相关信息。

上一篇下一篇

猜你喜欢

热点阅读