gpt4 book ai didi

macos - 在 Swift/Mac OS X 中编译着色器

转载 作者:搜寻专家 更新时间:2023-11-01 05:41:49 25 4
gpt4 key购买 nike

我在 Swift 中创建了一个自定义的 NGOpenGLView,我正在尝试编译一些着色器。我遇到了着色器编译错误,但 glGetShaderInfoLog 没有返回任何内容...无法调试。不过,着色器是使用 OpenGL Shader 构建器编译的,所以我不知道出了什么问题。

这就是我编译着色器并尝试获取信息的方式,

class CustomOpenGLView : NSOpenGLView {

override func awakeFromNib() {
var attributes : [NSOpenGLPixelFormatAttribute] = [
NSOpenGLPixelFormatAttribute(NSOpenGLPFADepthSize),
NSOpenGLPixelFormatAttribute(24),
NSOpenGLPixelFormatAttribute(NSOpenGLPFAOpenGLProfile),
NSOpenGLPixelFormatAttribute(NSOpenGLProfileVersion3_2Core),
NSOpenGLPixelFormatAttribute(0)]

self.pixelFormat = NSOpenGLPixelFormat(attributes: attributes)

initShaders()
}
override func drawRect(dirtyRect: NSRect) {
glClearColor(0, 0, 0, 1)
glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
//drawAnObject()
glFlush()
}


func compileShader(shaderName: NSString, shaderType: GLenum) -> GLuint {

let shaderPath: NSString? = NSBundle.mainBundle().pathForResource(shaderName, ofType: nil)
if shaderPath == nil {
println("Can't find shader \(shaderName)")
return 0
}
var error: NSError? = nil
let shaderString = NSString(contentsOfFile: shaderPath!, encoding: NSUTF8StringEncoding, error: &error)
if shaderString == nil {
println("Failed to set contents shader of shader file!")
return 0
}

var shaderHandle: GLuint = glCreateShader(shaderType)

var shaderStringUTF8 = shaderString!.cStringUsingEncoding(NSUTF8StringEncoding)
var shaderStringLength: GLint = GLint(shaderString!.length)
glShaderSource(shaderHandle, 1, &shaderStringUTF8, &shaderStringLength)

glCompileShader(shaderHandle)

var compileSuccess: GLint = GLint()
glGetShaderiv(shaderHandle, GLenum(GL_COMPILE_STATUS), &compileSuccess)
if (compileSuccess == GL_FALSE) {
println("Failed to compile shader! \(shaderName)")
var value: GLint = 0
glGetShaderiv(shaderHandle, GLenum(GL_INFO_LOG_LENGTH), &value)
var infoLog: [GLchar] = [GLchar](count: Int(value), repeatedValue: 0)
var infoLogLength: GLsizei = 0
glGetShaderInfoLog(shaderHandle, value, &infoLogLength, &infoLog)
var s = NSString(bytes: infoLog, length: Int(infoLogLength), encoding: NSASCIIStringEncoding)
println(s)
return 0
}
return shaderHandle
}

func initShaders() {

// Compile our vertex and fragment shaders.
var vertexShader: GLuint = self.compileShader("geometryColor.vs", shaderType: GLenum(GL_VERTEX_SHADER))
var fragmentShader: GLuint = self.compileShader("color.fs", shaderType: GLenum(GL_FRAGMENT_SHADER))
// ... etc
}
}

vs shader就是这样,

attribute vec3 position;
attribute vec4 color;
uniform mat4 Pmatrix;
uniform mat4 Vmatrix;
uniform mat4 Mmatrix;
varying vec4 vColor;
void main(void) { // pre-built function
gl_Position = Pmatrix * Vmatrix * Mmatrix * vec4(position, 1.);
vColor = color;
}

但我也尝试过更新的语法,

in vec3 position;
in vec4 color;
uniform mat4 Pmatrix;
uniform mat4 Vmatrix;
uniform mat4 Mmatrix;
out vec4 vColor;
void main(void) { // pre-built function
gl_Position = Pmatrix * Vmatrix * Mmatrix * vec4(position, 1.);
vColor = color;
}

glClear 正在运行,所以 View 本身看起来很好。关于如何调试这个的任何想法?

最佳答案

在创建和编译着色器之前,尝试使上下文成为当前上下文,我对 swift 不熟悉,但在您发布的代码中似乎没有做任何事情。

我有同样的问题,这里有另一个问题有这个答案,但我找不到它......

关于macos - 在 Swift/Mac OS X 中编译着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28755422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com