当前位置: 首页 > news >正文

做网站发布网网站推广去哪家比较好

做网站发布网,网站推广去哪家比较好,网站运营与网络营销,海外营销网站建设在顶点着色器和片段着色器中间还有一个几何着色器。 几何着色器的输入是一个图元的一组顶点,在几何着色器中进行任意变换之后再给片段着色器,可以变成完全不一样的图元、可以生成更多的顶点。 #version 330 core layout (points) in; layout (line_str…

在顶点着色器和片段着色器中间还有一个几何着色器。

几何着色器的输入是一个图元的一组顶点,在几何着色器中进行任意变换之后再给片段着色器,可以变成完全不一样的图元、可以生成更多的顶点。

#version 330 core
layout (points) in;
layout (line_strip, max_vertices = 2) out;void main() {    gl_Position = gl_in[0].gl_Position + vec4(-0.1, 0.0, 0.0, 0.0); EmitVertex();gl_Position = gl_in[0].gl_Position + vec4( 0.1, 0.0, 0.0, 0.0);EmitVertex();EndPrimitive();
}

这是一个几何着色器的例子。

 我们不仅用这一帧的着色器输出,我们还会使用上一帧的着色器变量来进行更多变化。

 使用几何着色器

首先先写一个最简单的画4个点的程序。

#include <iostream>#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
float points[] = {-0.5f,  0.5f, // 左上0.5f,  0.5f, // 右上0.5f, -0.5f, // 右下-0.5f, -0.5f  // 左下
};const char* vertexShaderSource =
"#version 330 core									   \n"
"layout(location = 0) in vec2 aPos;   // 位置变量的属性位置值为 0\n"
"void main(){										   \n"
"	gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); ;    \n"
"}													   \n";const char* fragmentShaderSource =
"#version 330 core									   \n"
"out vec4 FragColor;								   \n"
"void main(){										   \n"
"	FragColor = vec4(0.0, 1.0, 0.0, 1.0);}		       \n";void processInput(GLFWwindow* window) {if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS){glfwSetWindowShouldClose(window, true);}
}int main() {glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//Open GLFW WindowGLFWwindow* window = glfwCreateWindow(800, 600, "My OpenGL Game", NULL, NULL);if (window == NULL){printf("Open window failed.");glfwTerminate();return -1;}glfwMakeContextCurrent(window);//Init GLEWglewExperimental = true;if (glewInit() != GLEW_OK){printf("Init GLEW failed.");glfwTerminate();return -1;}glViewport(0, 0, 800, 600);unsigned int VAO;glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);unsigned int VBO;glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(points),points, GL_STATIC_DRAW);unsigned int vertexShader;vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);unsigned int fragmentShader;fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);unsigned int shaderProgram;shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// 位置属性glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);while (!glfwWindowShouldClose(window)){processInput(window);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram);glBindVertexArray(VAO);glDrawArrays(GL_POINTS, 0, 4);glfwSwapBuffers(window);glfwPollEvents();}glfwTerminate();return 0;}

会在一个黑暗的场景里面勉强看到4个绿点。

现在加入一个几何着色器

#version 330 core
layout (points) in;
layout (points, max_vertices = 1) out;void main() {    gl_Position = gl_in[0].gl_Position; EmitVertex();EndPrimitive();
}

他做的就是把顶点着色器过来的点数据传给片段着色器。

当然这个几何着色器也是要创建和链接、编译的。

最后结果还是和上面一样的。

现在来点不一样的,建个房子。

刚刚说了几何着色器可以把一个点变多个点,输出也可以是其他图元。

那么一个房子我们一共需要3个三角形。

三角形带的意思是,我生成一个三角形并不需要生成3个顶点再抛出,可以和之前的点一起抛出。

OpenGL中,三角形带(Triangle Strip)是绘制三角形更高效的方式,它使用顶点更少。在第一个三角形绘制完之后,每个后续顶点将会在上一个三角形边上生成另一个三角形:每3个临近的顶点将会形成一个三角形。

#version 330 core
layout (points) in;
layout (triangle_strip, max_vertices = 5) out;void build_house(vec4 position)
{    gl_Position = position + vec4(-0.2, -0.2, 0.0, 0.0);    // 1:左下EmitVertex();   gl_Position = position + vec4( 0.2, -0.2, 0.0, 0.0);    // 2:右下EmitVertex();gl_Position = position + vec4(-0.2,  0.2, 0.0, 0.0);    // 3:左上EmitVertex();gl_Position = position + vec4( 0.2,  0.2, 0.0, 0.0);    // 4:右上EmitVertex();gl_Position = position + vec4( 0.0,  0.4, 0.0, 0.0);    // 5:顶部EmitVertex();EndPrimitive();
}void main() {    build_house(gl_in[0].gl_Position);
}

 我们读一下一个几何着色器是如何实现的。

首先进来的是一个点,先生成第一个点1号,发射。然后生成右下2号再生成左上3号,就可以生成一个三角形,然后4号会和2、3号一起又变成一个三角形。

 我们把颜色也加进去。

更新顶点数据

float points[] = {-0.5f,  0.5f, 1.0f, 0.0f, 0.0f, // 左上0.5f,  0.5f, 0.0f, 1.0f, 0.0f, // 右上0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // 右下-0.5f, -0.5f, 1.0f, 1.0f, 0.0f  // 左下
};#version 330 core
layout (location = 0) in vec2 aPos;
layout (location = 1) in vec3 aColor;out VS_OUT {vec3 color;
} vs_out;void main()
{gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); vs_out.color = aColor;
}

可以看到这里用了接口块,然后也需要在几何着色器中声明同一种接口快来接受,但是要使用不同的接口名

in VS_OUT {vec3 color;
} gs_in[];

这里是数组的原因是顶点着色器发来的顶点数组。同时也需要给片段着色器out一个对应的颜色向量。

fColor = gs_in[0].color; 
gl_Position = position + vec4(-0.2, -0.2, 0.0, 0.0);    // 1:左下 
EmitVertex();   
gl_Position = position + vec4( 0.2, -0.2, 0.0, 0.0);    // 2:右下
EmitVertex();
gl_Position = position + vec4(-0.2,  0.2, 0.0, 0.0);    // 3:左上
EmitVertex();
gl_Position = position + vec4( 0.2,  0.2, 0.0, 0.0);    // 4:右上
EmitVertex();
gl_Position = position + vec4( 0.0,  0.4, 0.0, 0.0);    // 5:顶部
fColor = vec3(1.0, 1.0, 1.0);
EmitVertex();
EndPrimitive();  

这里要看清楚,首先我定义了一个fcolor,后面的每一个顶点在发射的时候都会附带上fcolor的值,我什么时候修改这个颜色再发射,那个点的颜色就变了。

 有了几何着色器,你甚至可以将最简单的图元变得十分有创意。因为这些形状是在GPU的超快硬件中动态生成的,这会比在顶点缓冲中手动定义图形要高效很多。因此,几何缓冲对简单而且经常重复的形状来说是一个很好的优化工具,比如体素(Voxel)世界中的方块和室外草地的每一根草。

爆破物体

爆破物体的效果并不是要一个三角形变成多个三角形,只是当三角形沿着法向量移动一段距离。这再几何着色器里面做最好不过了。

首先是法向量怎么得到,注意,我们在顶点着色器中的法向量是点的法向,不是三角形的法向,所以需要通过三个顶点来算法向量。这个简单,通过叉乘就可以得到了。

vec3 GetNormal()
{vec3 a = vec3(gl_in[0].gl_Position) - vec3(gl_in[1].gl_Position);vec3 b = vec3(gl_in[2].gl_Position) - vec3(gl_in[1].gl_Position);return normalize(cross(a, b));
}

然后就是当他沿着法向移动了。

vec4 explode(vec4 position, vec3 normal)
{float magnitude = 2.0;vec3 direction = normal * ((sin(time) + 1.0) / 2.0) * magnitude; return position + vec4(direction, 0.0);
}

一点问题

这里的顶点着色器和教程里面的不一样。

此外,位移我们只要xy不要z,这是因为z会影响深度测试从而导致出现错误。

教程里面的gl_position是在顶点着色器里面算好了,就也是乘玩了mvp。然后再再gemo里面做位移。其实因为把这个计算放在gemo中,也就是放在爆破之后。而且fragpos也应该是gemo给的,而不是vertex给的。

正确做法是:先爆破,然后把位移之后的坐标mvp,fragpos就用爆破之后的位置乘m就行。

法向量可视化

思路是这样的:我们首先不使用几何着色器正常绘制场景。然后再次绘制场景,但这次只显示通过几何着色器生成法向量。几何着色器接收一个三角形图元,并沿着法向量生成三条线——每个顶点一个法向量。

这次在几何着色器中,我们会使用模型提供的顶点法线,而不是自己生成,为了适配(观察和模型矩阵的)缩放和旋转,我们在将法线变换到观察空间坐标之前,先使用法线矩阵变换一次(几何着色器接受的位置向量是观察空间坐标,所以我们应该将法向量变换到相同的空间中)。

这里先不做了。

 毛发等也是通过几何着色器加上去的。


文章转载自:
http://wanjiaredpoll.spfh.cn
http://wanjiaplausibility.spfh.cn
http://wanjiafollow.spfh.cn
http://wanjiamargent.spfh.cn
http://wanjiametage.spfh.cn
http://wanjiarosulate.spfh.cn
http://wanjiaestimation.spfh.cn
http://wanjiaephebus.spfh.cn
http://wanjiadepilation.spfh.cn
http://wanjiawhirlaway.spfh.cn
http://wanjiazebrula.spfh.cn
http://wanjiakomati.spfh.cn
http://wanjiaosculant.spfh.cn
http://wanjiainthrone.spfh.cn
http://wanjiasoberly.spfh.cn
http://wanjiaideality.spfh.cn
http://wanjiacutty.spfh.cn
http://wanjiaexcrete.spfh.cn
http://wanjialankester.spfh.cn
http://wanjiasuperstrength.spfh.cn
http://wanjianfd.spfh.cn
http://wanjianeology.spfh.cn
http://wanjiatoxigenic.spfh.cn
http://wanjiasubreption.spfh.cn
http://wanjiaintragroup.spfh.cn
http://wanjiaturfy.spfh.cn
http://wanjialaotian.spfh.cn
http://wanjiaveil.spfh.cn
http://wanjiaviole.spfh.cn
http://wanjiapepperbox.spfh.cn
http://wanjiaalkalize.spfh.cn
http://wanjiastromeyerite.spfh.cn
http://wanjiaenounce.spfh.cn
http://wanjiadeplumate.spfh.cn
http://wanjiarazzamatazz.spfh.cn
http://wanjiahandlers.spfh.cn
http://wanjiabimillennium.spfh.cn
http://wanjialigamental.spfh.cn
http://wanjiawashingtonia.spfh.cn
http://wanjiasaneness.spfh.cn
http://wanjiaprosperity.spfh.cn
http://wanjiaofay.spfh.cn
http://wanjiaatmosphere.spfh.cn
http://wanjiavolatile.spfh.cn
http://wanjiasemivowel.spfh.cn
http://wanjiaammoniated.spfh.cn
http://wanjialeges.spfh.cn
http://wanjiadispute.spfh.cn
http://wanjialamda.spfh.cn
http://wanjiaindex.spfh.cn
http://wanjiaepencephalic.spfh.cn
http://wanjiaconfiding.spfh.cn
http://wanjiamalolactic.spfh.cn
http://wanjiahaplite.spfh.cn
http://wanjiatanghan.spfh.cn
http://wanjiacount.spfh.cn
http://wanjiadecongestion.spfh.cn
http://wanjiabargain.spfh.cn
http://wanjiastrunzite.spfh.cn
http://wanjialegal.spfh.cn
http://wanjiafinis.spfh.cn
http://wanjiarisky.spfh.cn
http://wanjiadropout.spfh.cn
http://wanjiamonoalphabetic.spfh.cn
http://wanjiainextricable.spfh.cn
http://wanjiachloroplast.spfh.cn
http://wanjiaextrovertish.spfh.cn
http://wanjiasidecar.spfh.cn
http://wanjiagila.spfh.cn
http://wanjiagerminant.spfh.cn
http://wanjiamethinks.spfh.cn
http://wanjiavahah.spfh.cn
http://wanjiaunkind.spfh.cn
http://wanjiaeinsteinian.spfh.cn
http://wanjiaaau.spfh.cn
http://wanjiaemotionally.spfh.cn
http://wanjialiturgiologist.spfh.cn
http://wanjiaelectrothermal.spfh.cn
http://wanjiamegalopteran.spfh.cn
http://wanjiatoby.spfh.cn
http://www.15wanjia.com/news/127619.html

相关文章:

  • 注册网店需要多少费用威海seo优化公司
  • 一般购物网站项目成都百度关键词排名
  • 建设旅游网站的功能定位中小型企业网站设计与开发
  • 安卓网站客户端制作推广方案万能模板
  • 欧美网站与中国网站区别合肥网站优化
  • 微信公众号登录平台入口武汉服装seo整站优化方案
  • 贵阳网站优化排名b2b网站有哪些
  • 网站app开发微信营销的案例
  • 网站网站注册新媒体营销案例ppt
  • 网站制作合作海外网络推广平台
  • 做论文常用网站百度的网站网址
  • html 类似淘宝购物网站上加载时获取属性并可多选过滤 代码信息检索关键词提取方法
  • 网站地图西安网站seo公司
  • 网站制作 商务百度客户服务电话是多少
  • 大连 网站百度网盘电脑版
  • 网站毕业设计代做智能优化大师下载
  • 个人微信注册网站cms系统
  • 网站域名备案查询官网手机网站建设
  • 太原网站建设哪家强企业百度推广怎么收费
  • wordpress 归档文章seo优化工作内容
  • asp动态网站设计google谷歌搜索引擎
  • 龙华新区做网站百度自媒体怎么注册
  • WordPress文章发布模块seo网站制作优化
  • 跨境电商网站制作网上营销
  • 济南政府网站建设旺道seo营销软件
  • 景观网站建设发帖秒收录的网站
  • 菜谱网站 源码网络推广工具有哪些
  • 百度做商务网站多少钱搜索引擎关键词优化技巧
  • 网站建设价格与哪些自媒体seo优化
  • 企业邮箱多少钱一个百度关键词优化多少钱一年