出于学习目的,我决定使用3种方法绘制球体
我读到使用ibo让程序运行得更快,但这是真的吗?对于100个切片和100个堆栈的球体,第二个方法产生40400个顶点,而第三个"仅"19802.通过这样做,我保存20598个每个32字节= 659136个字节.
verticesSize =(切片*4)*(堆叠+ 1);
IBO verticesSize =(slices*2)*(stacks-1)+2;
但是我需要创建索引数组,在这种情况下,大小为118800(创建所有面所需的索引数)*4(unsigned int的大小)= 475200字节!虽然第二种方法使用15fps渲染1000个球体,但第三种方法使用仅仅6pfs渲染1000个球体
或许我写的代码完全错了,为什么它如此挣扎:(如果有人有兴趣,这里是我的代码http://pastebin.com/raw.php?i=74jLKV5M
我一直在尝试找出如何将纹理发送到着色器,但是我无法弄清楚。我的代码对我来说不错,但我的第二个纹理是黑色。
void setShaders() {
glEnable (GL_TEXTURE_2D);
v2 = glCreateShader(GL_VERTEX_SHADER);
f2 = glCreateShader(GL_FRAGMENT_SHADER);
load_shader(v2,"a.vert");
load_shader(f2,"a.frag");
glCompileShader(v2);
glCompileShader(f2);
p = glCreateProgram();
glAttachShader(p,v2);
glAttachShader(p,f2);
GLubyte* textura=LoadImageToTexture("d.jpg");
GLubyte* textura2=LoadImageToTexture("n.jpg");
GLuint texturaID[2];
glGenTextures(2, texturaID);
glBindTexture(GL_TEXTURE_2D, texturaID[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA, w, h, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura );
glBindTexture(GL_TEXTURE_2D, texturaID[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,1,GL_RGBA, w, h, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura2 );
glLinkProgram(p);
glUseProgram(p);
GLint baseImageLoc = glGetUniformLocation(p, "tex");
GLint normImage = glGetUniformLocation(p, "norm");
glUniform1i(baseImageLoc, 0);
glUniform1i(normImage, 1);
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, texturaID[0]);
glActiveTexture(GL_TEXTURE0 + 1);
glBindTexture(GL_TEXTURE_2D, texturaID[1]);
}
Run Code Online (Sandbox Code Playgroud)
着色器[顶点]
void …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从站点对 Azure 中托管的 MVC 5 应用程序运行 ajax 调用。\n 但是该调用必须特定的“withCredentials”参数。
\n\n xhrFields: {\n withCredentials: true\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n在特定该参数之后,浏览器返回错误 \'(预计 CORS 标头 \xe2\x80\x9eAccess-Control-Allow-Credentials\xe2\x80\x9d\ 中 \xe2\x80\x9etrue\xe2\x80\x9d\'
\n\n为了克服这个问题,我在 Web.config 中添加了自定义标头。但 Azure 以某种方式删除了它们期望的 Test2 标头,该标头出现在响应中。
\n\n我的网络配置
\n\n<system.webServer>\n <validation validateIntegratedModeConfiguration="false" />\n <httpProtocol>\n <customHeaders>\n <add name="Test2" value="justTest" />\n <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />\n <add name="Access-Control-Allow-Credentials" value="true" />\n <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />\n </customHeaders>\n </httpProtocol>\n <handlers>\n <remove name="ExtensionlessUrlHandler-Integrated-4.0" />\n <remove name="OPTIONSVerbHandler" />\n <remove name="TRACEVerbHandler" />\n <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />\n </handlers>\n </system.webServer></configuration>\n …
Run Code Online (Sandbox Code Playgroud) 在我的程序中,我想绘制许多领域.首先我创建顶点,球体的索引然后将它们绑定到voa/vbo/ibo.之后我创建了1000个随机模型矩阵.现在我有两种绘制网格的方法.
glDrawElements
.矩阵MVP在CPU上计算并发送到着色器,如统一.glDrawElementsInstanced
.在测试程序中我画了1000个球体(大约20milions顶点)当我使用第一种方法时我得到27FPS而第二次降低性能到19FPS.理论上第二种方法应该达到比第一种更好的性能.
这是代码.
我认为瓶颈是顶点着色器中的这种乘法(VP * ModelMatrix)
,因为它需要为每个(网格中的顶点)*1000完成.
什么可以升级,我做错了什么?
我正在使用SSE设置Julia设置可视化.这是我的代码类和运算符
class vec4 {
public:
inline vec4(void) {}
inline vec4(__m128 val) :v(val) {}
__m128 v;
inline void operator=(float *a) {v=_mm_load_ps(a);}
inline vec4(float *a) {(*this)=a;}
inline vec4(float a) {(*this)=a;}
inline void operator=(float a) {v=_mm_load1_ps(&a);}
};
inline vec4 operator+(const vec4 &a,const vec4 &b) { return _mm_add_ps(a.v,b.v); }
inline vec4 operator-(const vec4 &a,const vec4 &b) { return _mm_sub_ps(a.v,b.v); }
inline vec4 operator*(const vec4 &a,const vec4 &b) { return _mm_mul_ps(a.v,b.v); }
inline vec4 operator/(const vec4 &a,const vec4 &b) { return _mm_div_ps(a.v,b.v); }
inline vec4 …
Run Code Online (Sandbox Code Playgroud) 如何线性化对数深度缓冲区?
片段着色器中线性深度缓冲区的可视化
float n = 1.0; // camera z near
float f = 27000000.0; // camera z far
float z = texture( DepthTex, TexCoord ).x;
float d = (2.0 * n) / (f + n - z * (f - n));
FragColor=vec4(d,d,d,1);
Run Code Online (Sandbox Code Playgroud)
球体顶点着色器
vec4 ClipCoords(vec3 position,mat4 matrix)
{
vec4 clip = matrix * vec4(position,1.0f);
clip.z =((2.0f * log(1.0f * clip.z + 1.0f) / log(1.0f * 27000000.0f + 1.0f)) - 1.0f) * clip.w;
return clip;
}
gl_Position = ClipCoords(position,matrix);
Run Code Online (Sandbox Code Playgroud)
左侧显示了对数深度缓冲线性或者更确切地说,它的缺乏,而右边显示linarization不log …
对于给定的数据库
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Run Code Online (Sandbox Code Playgroud)
问题是: 在 RAM 最低的 PC 中,找到生产 RAM 最低的 PC 和处理器速度最高的 PC 的打印机制造商。结果集:制造商。
让我们拆分查询!
SELECT DISTINCT maker from product Group By maker,type HAVING type IN('Printer','PC')
我认为这是错误的,因为 IN('Printer','PC') 就像 OR not AND
SELECT model,speed FROM pc WHERE ram=(SELECT MIN(ram) FROM pc) as minimumRam
Run Code Online (Sandbox Code Playgroud)WHERE lowestRam.speed=(SELECT MAX(speed) FROM pc WHERE ram=(SELECT MIN(ram) FROM pc))
查询本身!
SELECT DISTINCT maker FROM
(SELECT …
Run Code Online (Sandbox Code Playgroud) 在我的项目中,我想使用vbo显示许多对象(球体).我设法显示1个没有问题的对象,但是当涉及到2个或更多时,所有对象(vbos)都被最后定义的对象(vbo)替换.
CosmicBody(int x)
{
this->verticesSize=0;
//this->VaoId=x;
//this->VaoId=1;
this->VboId=x;
};
void CosmicBody::InitShape(unsigned int uiStacks, unsigned int uiSlices, float fA, float fB, float fC)
{
float tStep = (Pi) / (float)uiSlices;
float sStep = (Pi) / (float)uiStacks;
float SlicesCount=(Pi+0.0001)/tStep;
float StackCount=(2*Pi+0.0001)/sStep;
this->verticesSize=((int) (SlicesCount+1) * (int) (StackCount+1))*2;
glm::vec4 *vertices=NULL;
vertices=new glm::vec4[verticesSize];
int count=0;
for(float t = -Pi/2; t <= (Pi/2)+.0001; t += tStep)
{
for(float s = -Pi; s <= Pi+.0001; s += sStep)
{
vertices[count++]=glm::vec4(fA * cos(t) * cos(s),fB * cos(t) * …
Run Code Online (Sandbox Code Playgroud) 我正在将Python OpenCV代码转换为Emgu.在Python中,函数findContours
可以返回hierarchy
hierarchy - 可选输出向量,包含有关图像拓扑的信息.它具有与轮廓数量一样多的元素.对于每个第i个轮廓轮廓[i],元素层次[i] [0],层次[i] [1],层次[i] [2]和层次[i] [3]被设置为0-基于相同等级的下一轮和前轮廓的轮廓,第一轮廓和父轮廓的基础索引.如果轮廓i没有下一个,前一个,父级或嵌套轮廓,则层次结构[i]的相应元素将为负数.
不幸的是在Emgu我不能不为findContours
函数返回这样的数组.这有什么相同的吗?
让我们考虑以下代码:
void main(int argc, char* argv[])
{
Foo foo;
//at this point I don't need foo any more
//a lot of stuff here
}
Run Code Online (Sandbox Code Playgroud)
如果我只需要foo
很短的时间,那么在执行其余代码之前将它分配到堆上并删除是不是更好?