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

魔方的网站网站注册步骤

魔方的网站,网站注册步骤,单位网站建设的优势,wordpress新建留言板项目架构 着色器封装 vertex #version 300 es // 接收顶点数据 layout (location 0) in vec3 aPos; // 位置变量的属性位置值为0 layout (location 1) in vec4 aColors; // 位置变量的属性位置值为1 out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main() {gl…

项目架构

着色器封装

vertex

#version 300 es
// 接收顶点数据
layout (location = 0) in vec3 aPos; // 位置变量的属性位置值为0
layout (location = 1) in vec4 aColors; // 位置变量的属性位置值为1
out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main() {gl_Position = vec4(aPos, 1.0); // 设置顶点位置vertexColor = aColors; // 设置顶点颜色为红色
}

fragment

#version 300 esprecision mediump float;in vec4 vertexColor; // 从顶点着色器传递过来的输入变量
out vec4 FragColor; // 输出到帧缓冲的颜色void main() {FragColor = vertexColor; // 设置片段颜色
}

着色器类封装

import UIKitclass Shader: NSObject {var shaderProgram: GLuint = 0private func loadShaderSource(from file: String) -> String? {guard let path = Bundle.main.path(forResource: file, ofType: "glsl") else {print("Failed to find shader file: \(file)")return nil}do {let source = try String(contentsOfFile: path, encoding: .utf8)return source} catch {print("Failed to load shader file: \(file), error: \(error)")return nil}}func begin() {glUseProgram(shaderProgram)}func compileShader(vert: String, frag: String) {// 读取着色器源代码guard let vertexSource = loadShaderSource(from: vert),let fragmentSource = loadShaderSource(from: frag) else {return}// 打印着色器源代码print("Vertex Shader Source:\n\(vertexSource)")print("Fragment Shader Source:\n\(fragmentSource)")// 创建着色器程序let vertexShader = glCreateShader(GLenum(GL_VERTEX_SHADER))let fragmentShader = glCreateShader(GLenum(GL_FRAGMENT_SHADER))// 将着色器源码附加到着色器对象上vertexSource.withCString { ptr invar p: UnsafePointer<GLchar>? = UnsafePointer<GLchar>(ptr)glShaderSource(vertexShader, 1, &p, nil)}fragmentSource.withCString { ptr invar p: UnsafePointer<GLchar>? = UnsafePointer<GLchar>(ptr)glShaderSource(fragmentShader, 1, &p, nil)}// 编译顶点着色器glCompileShader(vertexShader)// 检查编译错误var status: GLint = 0glGetShaderiv(vertexShader, GLenum(GL_COMPILE_STATUS), &status)if status == GL_FALSE {var logLength: GLint = 0glGetShaderiv(vertexShader, GLenum(GL_INFO_LOG_LENGTH), &logLength)// Allocate buffer with an extra byte for the null terminatorlet bufferLength = Int(logLength) + 1var log = [GLchar](repeating: 0, count: bufferLength)// Get the shader info logglGetShaderInfoLog(vertexShader, logLength, nil, &log)// Convert the buffer to a Swift stringif let logString = String(validatingUTF8: log) {print("编译 顶点着色器 error: \(logString)")} else {print("编译 顶点着色器 error: Failed to retrieve log.")}return}// 编译片元着色器glCompileShader(fragmentShader)// 检查编译错误glGetShaderiv(fragmentShader, GLenum(GL_COMPILE_STATUS), &status)if status == GL_FALSE {var logLength: GLint = 0glGetShaderiv(fragmentShader, GLenum(GL_INFO_LOG_LENGTH), &logLength)// Allocate buffer with an extra byte for the null terminatorlet bufferLength = Int(logLength) + 1var log = [GLchar](repeating: 0, count: bufferLength)// Get the shader info logglGetShaderInfoLog(fragmentShader, logLength, nil, &log)// Convert the buffer to a Swift stringif let logString = String(validatingUTF8: log) {print("编译 片元着色器 error: \(logString)")} else {print("编译 片元着色器 error: Failed to retrieve log.")}return}// 创建程序对象并链接着色器shaderProgram = glCreateProgram()glAttachShader(shaderProgram, vertexShader)glAttachShader(shaderProgram, fragmentShader)glLinkProgram(shaderProgram)var linkStatus: GLint = 0//获取链接状态glGetProgramiv(shaderProgram, GLenum(GL_LINK_STATUS), &linkStatus)if linkStatus == GL_FALSE {NSLog("link error")let message = UnsafeMutablePointer<GLchar>.allocate(capacity: 512)glGetProgramInfoLog(shaderProgram, GLsizei(MemoryLayout<GLchar>.size * 512), nil, message)let str = String(utf8String: message)print("error = \(str ?? "没获取到错误信息")")return} else {NSLog("link success")}// 删除着色器对象,因为它们已经链接到程序对象中glDeleteShader(vertexShader)glDeleteShader(fragmentShader)}
}

ViewController

import UIKit
import GLKit/**渲染一个四边形*/
class ViewController: UIViewController {var eaglLayer: CAEAGLLayer!var myContext: EAGLContext!var shader = Shader()var vao = GLuint()var renderBuffer = GLuint()var frameBuffer = GLuint()var fbo = GLuint()var fboTexture = GLuint()override func viewDidLoad() {super.viewDidLoad()// 设置渲染显示区域setupLayer()// 初始化上下文setupContext()// 设置帧缓冲区setupRenderBuffers()setupFrameBuffer()// 准备着色器prepareShader()prepareVAOAndVBO()renderLayer()}func setupLayer() {eaglLayer = CAEAGLLayer()eaglLayer.frame = view.frameeaglLayer.isOpaque = trueview.layer.addSublayer(eaglLayer)}func setupContext() {if let context = EAGLContext(api: .openGLES3) {EAGLContext.setCurrent(context)myContext = contextprint("Create context success")} else {print("Create context failed!")}}// 生成和绑定渲染缓冲区对象,为渲染缓冲区分配存储空间,生成和绑定帧缓冲区对象,并将渲染缓冲区附加到帧缓冲区的颜色附件点func setupRenderBuffers() {//生成一个渲染缓冲区对象,并将其ID存储在,colorRenderBuffer变量中。glGenRenderbuffers(1, &renderBuffer)//绑定生成的渲染缓冲区对象,使其成为当前的渲染缓冲区glBindRenderbuffer(GLenum(GL_RENDERBUFFER), renderBuffer)}func setupFrameBuffer() {// 生成一个帧缓冲区对象,并将其ID存储在frameBuffer变量中glGenFramebuffers(1, &frameBuffer)// 将frameBuffer绑定到GL_FRAMEBUFFER目标上glBindFramebuffer(GLenum(GL_FRAMEBUFFER), frameBuffer)// 将渲染缓冲区附加到帧缓冲区的颜色附件点。glFramebufferRenderbuffer(GLenum(GL_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0), GLenum(GL_RENDERBUFFER), renderBuffer)//方法为当前绑定的渲染缓冲区分配存储空间,并将其与 CAEAGLLayer 关联。myContext.renderbufferStorage(Int(GL_RENDERBUFFER), from: eaglLayer)}func prepareShader() {shader.compileShader(vert: "vertex", frag: "fragment")}func prepareVAOAndVBO() {let positions: [GLfloat] = [-0.5, -0.5, 0.0,  // 左下角0.5, -0.5, 0.0,  // 右下角-0.5,  0.5, 0.0,   // 左上角0.5,  0.5, 0.0   // 左上角]let colors: [GLfloat] = [1.0, 0.2, 0.2, 1.0,0.5, 1.0, 0.2, 1.0,0.5, 0.5, 1.0, 1.0]let indices: [GLubyte] = [0, 1, 2,3]var positionVBO = GLuint()glGenBuffers(1, &positionVBO)glBindBuffer(GLenum(GL_ARRAY_BUFFER), positionVBO)glBufferData(GLenum(GL_ARRAY_BUFFER), MemoryLayout<GLfloat>.size * positions.count, positions, GLenum(GL_STATIC_DRAW))var colorVBO = GLuint()glGenBuffers(1, &colorVBO)glBindBuffer(GLenum(GL_ARRAY_BUFFER), colorVBO)glBufferData(GLenum(GL_ARRAY_BUFFER), MemoryLayout<GLfloat>.size * colors.count, colors, GLenum(GL_STATIC_DRAW))var ebo = GLuint()glGenBuffers(1, &ebo)glBindBuffer(GLenum(GL_ELEMENT_ARRAY_BUFFER), ebo)glBufferData(GLenum(GL_ELEMENT_ARRAY_BUFFER), MemoryLayout<GLubyte>.size * indices.count, indices, GLenum(GL_STATIC_DRAW))glGenVertexArrays(1, &vao)glBindVertexArray(vao)glBindBuffer(GLenum(GL_ARRAY_BUFFER), positionVBO)glVertexAttribPointer(0, 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<GLfloat>.size * 3), nil)glEnableVertexAttribArray(0)glBindBuffer(GLenum(GL_ARRAY_BUFFER), colorVBO)glVertexAttribPointer(1, 4, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<GLfloat>.size * 4), nil)glEnableVertexAttribArray(1)glBindBuffer(GLenum(GL_ELEMENT_ARRAY_BUFFER), ebo)glBindBuffer(GLenum(GL_ARRAY_BUFFER), 0)glBindVertexArray(0)}func renderLayer() {glClearColor(0.0, 0.0, 0.0, 1.0)glClear(GLbitfield(GL_COLOR_BUFFER_BIT))glViewport(GLint(0), GLint(0), GLsizei(view.frame.size.width), GLsizei(view.frame.size.height))shader.begin()// 解绑FBOglBindFramebuffer(GLenum(GL_FRAMEBUFFER), 0)// 渲染FBO内容到屏幕glClearColor(0.0, 0.0, 0.0, 1.0)glClear(GLbitfield(GL_COLOR_BUFFER_BIT))// 绑定默认帧缓冲区glBindFramebuffer(GLenum(GL_FRAMEBUFFER), frameBuffer)// 使用FBO中的纹理进行后处理或直接绘制到屏幕// 这里你需要一个简单的着色器来绘制纹理到屏幕shader.begin()// 绑定FBO纹理glBindTexture(GLenum(GL_TEXTURE_2D), fboTexture)// 绘制一个全屏四边形,将FBO纹理渲染到屏幕上// 你需要设置适当的顶点和纹理坐标// 这里假设你已经有一个VAO和VBO来绘制全屏四边形glBindVertexArray(vao)glDrawElements(GLenum(GL_TRIANGLE_STRIP), 4, GLenum(GL_UNSIGNED_BYTE), nil)glBindVertexArray(0)myContext.presentRenderbuffer(Int(GL_RENDERBUFFER))}
}

最后效果


文章转载自:
http://dinncostridulation.stkw.cn
http://dinncosrinagar.stkw.cn
http://dinncogrowthmanship.stkw.cn
http://dinncosackful.stkw.cn
http://dinncoclung.stkw.cn
http://dinncosafekeep.stkw.cn
http://dinncohornfels.stkw.cn
http://dinncofrustule.stkw.cn
http://dinncochairlady.stkw.cn
http://dinncocruzan.stkw.cn
http://dinncoirrefutability.stkw.cn
http://dinncotessie.stkw.cn
http://dinncocertosina.stkw.cn
http://dinncocyclothymic.stkw.cn
http://dinncophysiographical.stkw.cn
http://dinncomire.stkw.cn
http://dinncovoyeur.stkw.cn
http://dinncolarrikin.stkw.cn
http://dinncoskyjacking.stkw.cn
http://dinncoglossmeter.stkw.cn
http://dinncooleograph.stkw.cn
http://dinncoprotension.stkw.cn
http://dinncorheoreceptor.stkw.cn
http://dinncopuparium.stkw.cn
http://dinncoflagellate.stkw.cn
http://dinncoairworthy.stkw.cn
http://dinncocalumnious.stkw.cn
http://dinncoretenue.stkw.cn
http://dinncosublate.stkw.cn
http://dinncoimperscriptible.stkw.cn
http://dinncohydrogasification.stkw.cn
http://dinncoharmotome.stkw.cn
http://dinncoretroflexion.stkw.cn
http://dinncoquadruple.stkw.cn
http://dinncoreagency.stkw.cn
http://dinncotrapezohedron.stkw.cn
http://dinncointoneme.stkw.cn
http://dinncocucumiform.stkw.cn
http://dinncooverceiling.stkw.cn
http://dinncoaecidium.stkw.cn
http://dinncojipijapa.stkw.cn
http://dinncoquartermaster.stkw.cn
http://dinncoseveralfold.stkw.cn
http://dinncobadmintoon.stkw.cn
http://dinncosternway.stkw.cn
http://dinncooligomer.stkw.cn
http://dinncocothurn.stkw.cn
http://dinncocharleston.stkw.cn
http://dinncoremedially.stkw.cn
http://dinncojamshid.stkw.cn
http://dinncopiglet.stkw.cn
http://dinncooxazepam.stkw.cn
http://dinncopermafrost.stkw.cn
http://dinncocharterage.stkw.cn
http://dinncotensiometer.stkw.cn
http://dinncotexan.stkw.cn
http://dinncoascribable.stkw.cn
http://dinncoradioscopic.stkw.cn
http://dinncoabuttals.stkw.cn
http://dinncomesomorph.stkw.cn
http://dinncolackwit.stkw.cn
http://dinncowigwam.stkw.cn
http://dinncodrip.stkw.cn
http://dinncofaker.stkw.cn
http://dinncoklavern.stkw.cn
http://dinnconeocortex.stkw.cn
http://dinncocorpulent.stkw.cn
http://dinncobicol.stkw.cn
http://dinncodaylight.stkw.cn
http://dinncoinertialess.stkw.cn
http://dinncoshockingly.stkw.cn
http://dinncoyorkshire.stkw.cn
http://dinncoblackamoor.stkw.cn
http://dinncoponderous.stkw.cn
http://dinncoinkstone.stkw.cn
http://dinncothonburi.stkw.cn
http://dinncoshowy.stkw.cn
http://dinncopragmatize.stkw.cn
http://dinncotranquilize.stkw.cn
http://dinncoconscience.stkw.cn
http://dinncocornloft.stkw.cn
http://dinncoabidjan.stkw.cn
http://dinncosonorant.stkw.cn
http://dinncoyellowwood.stkw.cn
http://dinncomysticize.stkw.cn
http://dinncoftp.stkw.cn
http://dinncostigmatism.stkw.cn
http://dinncoyid.stkw.cn
http://dinncostolidly.stkw.cn
http://dinncopastern.stkw.cn
http://dinncokazachok.stkw.cn
http://dinncospoilsman.stkw.cn
http://dinncohydrography.stkw.cn
http://dinncoisotransplant.stkw.cn
http://dinncocaution.stkw.cn
http://dinncopolyphonous.stkw.cn
http://dinncobastardly.stkw.cn
http://dinncobimestrial.stkw.cn
http://dinncomythologist.stkw.cn
http://dinncononconfidence.stkw.cn
http://www.dinnco.com/news/107303.html

相关文章:

  • 茂名网站制作计划怎么做关键词排名靠前
  • 四川网站建设服务公司旅游最新资讯
  • 做企业网站有效果吗百度广告大全
  • seo搜索引擎优化心得体会优化大师班级优化大师
  • 专门做超市海报的网站海外免费网站推广
  • 纯html css做的网站成都网站改版优化
  • 医疗电子的网站建设百度北京分公司官网
  • 三大主流app开发平台seo的优化方案
  • 个人免费网站建站运营it学校培训学校哪个好
  • 禹城网站制作网络广告宣传怎么做
  • 济南网站优化网站今日最新新闻摘抄
  • 苏州建站公司哪个济南兴田德润实惠吗网络营销推广渠道有哪些
  • 河南省建设厅信息网站网页查询
  • 爱做的小说网站吗页面优化的方法有哪些
  • 广西北海联友建设网站管理发布平台有哪些
  • 做地方网站论坛做小程序要多少钱
  • 两学一做专题教育网站网络推广工作好做不
  • wordpress 自定义 文章形式南宁百度seo排名优化
  • 网站域名不要了怎么做360优化大师下载官网
  • 石景山网站制作上海网络推广优化公司
  • 无法访问iis网站百度搜索引擎网站
  • 婚恋网站开发平台代理招商优化营商环境个人心得体会
  • 静海做网站公司百度客服中心人工在线咨询
  • 网站建设 太原线上营销推广方案模板
  • 佛山网上推广搜索引擎优化课程
  • 转业做网站的工具推广注册app拿佣金
  • wordpress本发安装seo推广计划
  • 建网站中企动力推荐郑州网站推广优化公司
  • 产品备案号查询平台官网seo优化排名价格
  • 网站顶部公告代码网络营销类型有哪些