我将 golang 与 OpenGL 结合使用。
我使用 TEXTURE_2D_ARRAY 加载纹理渲染一个立方体,但结果是一个黑色立方体。
我确定纹理单元指定正确,因为当我在 TEXTURE_CUBE_MAP 加载模式下使用 ActiveTexture(gl.TEXTURE3) 时,它用于显示目的,但现在使用 TEXTURE_2D_ARRAY 看起来像纹理不起作用。
像这样的纹理加载代码
func GenBindTexture(TextureType uint32) uint32{
var texture uint32
gl.GenTextures(1, &texture)
gl.ActiveTexture(gl.TEXTURE3)
gl.BindTexture(TextureType, texture)
//gl.TexEnvi()
return texture
}
func TestTextureArray(){
fmt.Println("texture number:",GenBindTexture(gl.TEXTURE_2D_ARRAY))
rgba,err:=DrawRGBA("Texture/T1.png")
if err!=nil{
fmt.Println("Err:",err)
return
}
gl.TextureStorage3D(
gl.TEXTURE_2D_ARRAY,
1,
gl.RGBA,
int32(rgba.Rect.Size().X),int32(rgba.Rect.Size().Y),
1,
)
fmt.Printf("error is invlid option:%x\n",gl.GetError())//in here get INVALID_ENUM
gl.TexSubImage3D(
gl.TEXTURE_2D_ARRAY,
0,
0,0,int32(0),
int32(rgba.Rect.Size().X),int32(rgba.Rect.Size().Y),1,
gl.RGBA,
gl.UNSIGNED_BYTE,
gl.Ptr(rgba.Pix),//they are color,i'm not set for random ,just test
)
fmt.Printf("error is invlid option:%x\n",gl.GetError())//in here get INVALID_Value
gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)//
}
渲染&统一设置
TestTextureArray()
textureUniform := gl.GetUniformLocation(program, gl.Str("tex1\x00"))
gl.Uniform1i(textureUniform, 3) //传输tex1为对应的纹理单元id ,如果tex1已经被binding=纹理单元id则不用如此操作
//gl.Uniform1i(0,0)
fmt.Printf("error is:%x\n",gl.GetError())
gl.ClearColor(0.9, 0.9, 0.9, 0.6)
angle := 0.0
previousTime := glfw.GetTime()
for !window.ShouldClose() {
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
// Update
time := glfw.GetTime()
elapsed := time - previousTime
previousTime = time
angle += elapsed
model = mgl32.HomogRotate3D(float32(angle), mgl32.Vec3{0, 1, 0})
// Render
gl.UseProgram(program)
gl.UniformMatrix4fv(modelUniform, 1, false,&model[0])
gl.BindVertexArray(vao)
//gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 6*4)
Render(program)
window.SwapBuffers()
glfw.PollEvents()
}
}
func Render(program uint32){
for CubeFace:=0;CubeFace!=6;CubeFace++ {
SetUniformVar(program,"Layer",CubeFace)
//gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 6*4)
gl.DrawElementsBaseVertex(gl.TRIANGLE_STRIP,4,gl.UNSIGNED_INT,gl.PtrOffset(0),int32(CubeFace*4))
}
和这样的着色器代码
var VertexShaderMulti=`
# version 450
uniform mat4 projection;
uniform mat4 camera;
uniform mat4 model;
in vec3 vert;
in vec2 vertTexCoord;
out vec2 uv;
void main() {
uv = vertTexCoord;
gl_Position = projection * camera * model * vec4(vert, 1.3);
}
` + "\x00"
var FragmentShaderMulti=`
# version 450
uniform sampler2DArray tex1;
uniform int Layer=2;
in vec2 uv;
out vec4 outputColor;
void main(void){
outputColor=texture(tex1, vec3(uv,0));
}
`+ "\x00"
现在我实际上使用 RenderDoc 找到 sampler2DArray tex1 值
sampler2DArray tex1
任何帮助,我将不胜感激!
最佳答案
最后我找到了原因,在 gl.TextureStorage3D 之后使用 gl.GetError() 我得到了 INVALID_ENUM,引用这个 document这意味着内部格式有问题,所以我将 gl.RGBA 更改为 gl.RGBA8
一切都很完美~它有多个纹理绑定(bind)一个纹理单元 beautiful cube ~
谢谢大家的回答,我不是一个人^v^
关于opengl - TEXTURE_2D_ARRAY 未渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50485176/
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'
我认为按照惯例,只有带有感叹号的方法才能更改对象。>array=[1,2,3]=>[1,2,3]>array.pop=>3>array=>[1,2]为什么Array的pop方法不调用pop!? 最佳答案 这不太正确。来自TheRubyStyleGuide潜在“危险”方法的名称(即修改自身或参数的方法,exit!(不像exit那样运行终结器)等)如果存在则应以感叹号结尾该危险方法的安全版本。而且pop方法的名称准确地说明了它在做什么,因此无需使用感叹号对其进行签名。 关于ruby-为什么A