小编And*_*man的帖子

为什么HLSL有语义?

在HLSL中,我必须使用语义将信息从顶点着色器传递到片段着色器.在GLSL中,不需要语义.语义的客观利益是什么?

示例:GLSL

顶点着色器

varying vec4 foo
varying vec4 bar;

void main() {
  ...
  foo = ...
  bar = ...
}
Run Code Online (Sandbox Code Playgroud)

片段着色器

varying vec4 foo
varying vec4 bar;

void main() {
  gl_FragColor = foo * bar;
}
Run Code Online (Sandbox Code Playgroud)

示例:HLSL

顶点着色器

struct VS_OUTPUT
{
   float4  foo : TEXCOORD3;
   float4  bar : COLOR2;
}

VS_OUTPUT whatever()
{
  VS_OUTPUT out;

  out.foo = ...
  out.bar = ...

  return out;
}
Run Code Online (Sandbox Code Playgroud)

像素着色器

void main(float4 foo : TEXCOORD3,
          float4 bar : COLOR2) : COLOR
{
    return foo * …
Run Code Online (Sandbox Code Playgroud)

glsl hlsl

13
推荐指数
1
解决办法
4712
查看次数

sin(x)仅为GLSL片段着色器Intel HD4000上的中等大输入返回4个不同的值

我有一个用GLSL编写的简单的OpenGL 3.3片段着色器.从本质上讲,我正在评估sin(x)适度大的x(10,000到2,000,000之间),如下所示:

#version 330
out vec4 fColor;
void main() {
  fColor = vec4(sin(gl_FragCoord.x * gl_FragCoord.y));
}
Run Code Online (Sandbox Code Playgroud)

它在我的NVidia显卡上工作正常,但在我的Intel HD4000上,正弦仅返回四个不同的值(+/- 1.0和大约+/- 0.3),高于大约10,000的输入.

系统:Windows 64bit,(Intel)驱动程序版本15.28.20.64.3347.

我的问题:这是一个错误吗?或者供应商是否可以通过这种方式自由实施正弦?

opengl trigonometry intel glsl

9
推荐指数
1
解决办法
672
查看次数

DrawerLayout ListView未使用GLSurfaceView作为内容绘制

我的Android应用程序是全屏OpenGL ES 2.0应用程序,因此主要内容是GLSurfaceView的自定义扩展.活动布局如下所示:

<android.support.v4.widget.DrawerLayout
              xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/drawer_layout">
    <FrameLayout android:id="@+id/content_frame"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent" />
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111" />
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

然后我使用FrameLayout的addView方法添加我的GLSurfaceView.如果我不这样做,抽屉按预期工作.

当我将其滑入时,ListView似乎被正确拉出,因为我无法再与GLSurfaceView交互,直到我向左滑动它.但它根本没有显示,就像GLSurfaceView总是在它上面渲染一样.

如何使用GLSurfaceView作为其内容使用DrawerLayout?

java android listview opengl-es

8
推荐指数
1
解决办法
959
查看次数

在THREE.js中检索顶点数据

我正在使用自定义着色器创建网格.在顶点着色器中,我正在修改几何顶点的原始位置.然后我需要从着色器外部访问这个新的顶点位置,我该如何实现呢?

shader textures webgl vertex-shader three.js

7
推荐指数
1
解决办法
1769
查看次数

用于字符数组的初始化字符串太长错误

我正在使用C++开发BlackJack游戏,我在其中有以下代码,我收到错误

typedef struct
{
    int value;
    char suit[8];
    char name[8];
}Deck;


Deck Cards[52] = {{ 1,"Ace","Hearts"},{ 2, "Two","Hearts"}, { 3, "Three", "Hearts"}, { 4, "Four","Hearts"}, { 5,"Five","Hearts"},{ 6,"Six", "Hearts06"},
{ 7,"Seven","Hearts"},{ 8,"Eight","Hearts"},{ 9,"Nine","Hearts"},{ 10,"Ten","Hearts"},{10,"Jack","Hearts"},{10,"Queen","Hearts"},{10,"King","Hearts"},
{ 1,"Ace","Clubs"},{2, "Two", "Clubs"},{3,"Three","Clubs"},{4,"Four","Clubs"},{5,"Five","Clubs"},{6,"Six","Clubs"},{7,"Seven","Clubs"},{8,"Eight","Clubs"},
{ 9,"Nine","Clubs"},{10,"Ten","Clubs"},{10,"Jack","Clubs"},{10,"Queen","Clubs"},{10,"King","Clubs"},
{ 1,"Ace","Diamonds"},{2,"Two","Diamonds"},{3,"Three","Diamonds"},{4,"Four","Diamonds"},{5,"Five","Diamonds"},{6,"Six","Diamonds"},{7,"Seven","Diamonds"},
{ 8,"Eight","Diamonds"},{9,"Nine","Diamonds"},{10,"Ten","Diamonds"},{10,"Jack","Diamonds"},{10,"Queen","Diamonds"},{10,"King","Diamonds"},
{ 1,"Ace","Spades"},{ 2,"Two","Spades"},{3,"Three","Spades"},{4,"Four","Spades"},{5,"Five","Spades"},{6,"Six","Spades"},{7,"Seven","Spades"},
{ 8,"Eight","Spades"},{ 9,"Nine","Spades"},{10,"Ten","Spades"},{10,"Jack","Spades"},{10,"Queen","Spades"},{10,"King","Spades"}};
Run Code Online (Sandbox Code Playgroud)

错误

Main.c:39:127: error: initializer-string for array of chars is too long [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

第39行是上面发布的代码中的最后一行

请帮我弄清楚编译器抛出错误的原因

c++ blackjack

5
推荐指数
1
解决办法
3万
查看次数

gpus_ReturnNotPermittedKillClient由于缺少生命周期事件而暂停OpenGL,因此在键盘扩展中使用SpriteKit崩溃

在尝试在iOS 8键盘扩展中使用SpriteKit时,我遇到了许多崩溃,这些崩溃只发生在使用物理设备而未连接到调试器时.

如果调试器连接到设备,或者如果在SIM卡中运行,一切都很可爱.

当没有连接调试器时,我相信扩展的生命周期略有不同,有时候键盘扩展会背景化,导致OpenGL崩溃.

苹果技术说明中描述了我们遇到的崩溃.它位于函数gpus_ReturnNotPermittedKillClient中,并且Apple声明它出现是因为您无法在后台运行OpenGL,并建议使用App Delegate回调来暂停您的OpenGL活动.

由于这是键盘扩展,因此没有应用程序委托.相反,我们尝试注册app委托生命周期通知:没有运气 - 他们不会开火.所以我们尝试使用viewcontroller生命周期回调,它仍然无法解决问题.

当这次崩溃发生时,我们是活跃的键盘,并且只是围绕SpriteKit/SKView和UIImage操作做了很多事情,没有明显的理由我们为什么会背景,但是这种崩溃发生了.如果我们真正做到背景,似乎也会发生同样的崩溃.

最后,我试图弄清楚如何知道我们正在进行背景化,并且我们需要暂停OpenGL.

这是完整的堆栈:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000001
Triggered by Thread:  0

Thread 0 name:  Dispatch queue: com.apple.spritekit.renderQueue
Thread 0 Crashed:
0   libGPUSupportMercury.dylib      0x000000018e89a18c gpus_ReturnNotPermittedKillClient + 12
1   libGPUSupportMercury.dylib      0x000000018e89b124 gpusSubmitDataBuffers + 160
2   GLEngine                        0x0000000189a10260 gliPresentViewES_Exec + 192
3   GLEngine                        0x0000000189a10164 gliPresentViewES + 80
4   OpenGLES                        0x0000000189a1fc7c -[EAGLContext presentRenderbuffer:] + 68
5   SpriteKit                       0x000000018a51c4a4 -[SKView _renderContent] + 1028
6   libdispatch.dylib               0x0000000196c8d368 _dispatch_client_callout + 12
7 …
Run Code Online (Sandbox Code Playgroud)

keyboard opengl-es ios skview ios-app-extension

5
推荐指数
0
解决办法
1082
查看次数

显式多重采样与OpenGL中的常规多重采样有何不同

我在28byteslater.com上阅读了关于延迟着色的MSAA的本教程.

它说,在显式多重采样中,我们可以访问特定的样本.

难道我们不能从GL_TEXTURE_2D_MULTISAMPLE例如绑定的常规纹理中做同样的事情吗?

这是我之前用于访问单个样本的着色器代码(不使用明显的多重采样):

uniform sampler2DMS Diffuse;

ivec2 Texcoord          = ivec2(textureSize(Diffuse) * In.Texcoord);
vec4  colorFirstSample  = texelFetch(Diffuse, Texcoord, 0);
vec4  colorSecondSample = texelFetch(Diffuse, Texcoord, 1);
vec4  colorThirdSample  = texelFetch(Diffuse, Texcoord, 2);
Run Code Online (Sandbox Code Playgroud)

我在显式多重采样中看到的唯一不同之处是它们texelFetchRenderbuffer()在着色器中使用并且纹理被绑定GL_TEXTURE_RENDERBUFFER_NV.加上如果我没记错,它在着色器中不可能使用RenderBuffer,现在我们可以吗?

opengl multisampling glsl opengl-3

4
推荐指数
1
解决办法
3574
查看次数

OpenGL FrameBuffer 上下颠倒和右下角

所以我正在制作一个可以使用 directx10,11 和 opengl 的引擎。

到目前为止一切都很顺利。它可以正确渲染 opengl 和 directx 中的图像,并且两者看起来相同。

现在我添加了渲染目标。在 DirectX 中它运行得很好并且到目前为止没有任何问题。但是使用 OpenGL,我之前绘制的纹理是颠倒的,位于渲染目标的右下角。

  截屏

你们知道问题是什么吗?为什么它在没有渲染目标的情况下也能正常工作?

如果需要我可以发送一些代码。我只需要先排序。

opengl framebuffer

4
推荐指数
1
解决办法
5164
查看次数

glTexImage2D与gluBuild2DMipmaps

非常基本的OpenGL纹理创建代码:

int width, height;
BYTE * data;
FILE * file;
// open texture data
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
// allocate buffer
width = 256;
height = 256;
data =(BYTE*) malloc( width * height * 3 );
// read texture data
fread( data, width * height * 3, 1, file );
fclose( file );
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
//gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width,   height, GL_RGB, GL_UNSIGNED_BYTE, data ); …
Run Code Online (Sandbox Code Playgroud)

opengl texturing glteximage2d mipmaps glu

3
推荐指数
1
解决办法
5049
查看次数

WebGL / OpenGL:比较性能

出于教育目的,我需要比较WebGL与OpenGL的性能。我有两个用WebGL和OpenGL编写的等效程序,现在需要获取它们的帧速率并进行比较。

在Javascript中,我使用requestAnimationFrame了动画效果,并且注意到它使帧频始终为60 FPS,并且只有在切换标签页或窗口时才会降低。另一方面,如果我总是递归地调用render函数,则由于明显的原因,窗口会冻结。

这就是我采用FPS的方式:

var stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.left = '450px';
stats.domElement.style.top = '750px';

document.body.appendChild( stats.domElement );

setInterval( function () {

    stats.begin();
    stats.end();
}, 1000 / 60 );


var render= function() {
    requestAnimationFrame(render);
    renderer.render(scene,camera);
}

render();
Run Code Online (Sandbox Code Playgroud)

现在,如果场景始终以60 FPS的速度存在问题,那就是我实际上无法将其与OpenGL的帧速率进行比较,因为OpenGL仅在以某种方式修改场景(例如,如果旋转对象)并glutPostRedisplay()调用场景时才重绘场景。

因此,我猜想WebGL中是否只有在必要时才可以重绘场景,例如,旋转对象或更改着色器中的某些属性时。

javascript opengl opengl-es webgl three.js

3
推荐指数
1
解决办法
4370
查看次数